GPUComputePassEncoder: setBindGroup() 方法

实验性: 这是一个 实验性技术
在生产环境中使用它之前,请仔细查看 浏览器兼容性表

安全上下文: 此功能仅在 安全上下文(HTTPS)中可用,在一些或所有 支持浏览器中。

setBindGroup() 方法是 GPUComputePassEncoder 接口的一部分,它将 GPUBindGroup 设置为在给定索引下用于后续计算命令。

语法

js
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
             dynamicOffsetsLength)

参数

index

要设置绑定组的索引。这与着色器代码中相应 @group(n) 属性的 n 索引值匹配 (GPUShaderModule),用于相关管道。

bindGroup

用于后续计算命令的 GPUBindGroup

dynamicOffsets 可选

指定每个在 bindGroup 中具有 hasDynamicOffset: true 设置的条目(即在创建 bindGroup 所基于的 GPUBindGroupLayout 对象的 GPUDevice.createBindGroupLayout() 调用描述符中)的偏移量(以字节为单位)。此值可以是

  • 一个数字数组,指定不同的偏移量。
  • 一个包含指定偏移量的数字的 Uint32Array

如果为 dynamicOffsets 指定了 Uint32Array 值,则还需要以下两个参数

dynamicOffsetsStart

指定动态偏移数据开始位置的偏移量(以数组元素为单位),该位置位于 dynamicOffsetsData 中。

dynamicOffsetsLength

指定要从 dynamicOffsetsData 中读取的动态偏移值的数量。

返回值

无 (Undefined).

异常

对于使用 Uint32Array 值作为 dynamicOffsetssetBindGroup() 调用,如果

  • dynamicOffsetsStart 小于 0。
  • dynamicOffsetsStart + dynamicOffsetsLength 大于 dynamicOffsets.length

验证

在调用 dispatchWorkgroups() 时,必须满足以下标准,否则将生成 GPUValidationError,并且 GPUComputePassEncoder 将变为无效

  • index 小于或等于 GPUDevicemaxBindGroups 限制
  • dynamicOffsets.lengthbindGroup 中具有 hasDynamicOffset: true 设置的条目数量相同。
  • 对于绑定 buffertype"uniform"bindGroup 条目(请参见 GPUDevice.createBindGroupLayout()),dynamicOffsets 中的每个数字都是 GPUDeviceminUniformBufferOffsetAlignment 限制 的倍数。
  • 对于绑定 buffertype"storage""read-only-storage"bindGroup 条目(请参见 GPUDevice.createBindGroupLayout()),dynamicOffsets 中的每个数字都是 GPUDeviceminStorageBufferOffsetAlignment 限制 的倍数。
  • 对于每个 bindGroup 条目,绑定 bufferoffset 加上对应布局条目的 minBindingSize 加上 dynamicOffsets 中指定的对应动态偏移量,小于或等于绑定 buffersize

示例

在我们的 基本计算演示 中,通过 GPUCommandEncoder 记录了多个命令。这些命令中的大多数源自通过 beginComputePass() 创建的 GPUComputePassEncoder。此处使用的 setBindGroup() 调用是最简单的形式,只指定了索引和绑定组。

js
const BUFFER_SIZE = 1000;

// ...

// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();

// Initiate render pass
const passEncoder = commandEncoder.beginComputePass();

// Issue commands
passEncoder.setPipeline(computePipeline);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.dispatchWorkgroups(Math.ceil(BUFFER_SIZE / 64));

// End the render pass
passEncoder.end();

// Copy output buffer to staging buffer
commandEncoder.copyBufferToBuffer(
  output,
  0, // Source offset
  stagingBuffer,
  0, // Destination offset
  BUFFER_SIZE,
);

// End frame by passing array of command buffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);

// ...

规范

规范
WebGPU
# programmable-passes-bind-groups

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅