GPUComputePassEncoder: setBindGroup() 方法
setBindGroup()
方法是 GPUComputePassEncoder
接口的一部分,它将 GPUBindGroup
设置为在给定索引下用于后续计算命令。
语法
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
值作为 dynamicOffsets
的 setBindGroup()
调用,如果
dynamicOffsetsStart
小于 0。dynamicOffsetsStart
+dynamicOffsetsLength
大于dynamicOffsets.length
。
验证
在调用 dispatchWorkgroups()
时,必须满足以下标准,否则将生成 GPUValidationError
,并且 GPUComputePassEncoder
将变为无效
index
小于或等于GPUDevice
的maxBindGroups
限制。dynamicOffsets.length
与bindGroup
中具有hasDynamicOffset: true
设置的条目数量相同。- 对于绑定
buffer
的type
为"uniform"
的bindGroup
条目(请参见GPUDevice.createBindGroupLayout()
),dynamicOffsets
中的每个数字都是GPUDevice
的minUniformBufferOffsetAlignment
限制 的倍数。 - 对于绑定
buffer
的type
为"storage"
或"read-only-storage"
的bindGroup
条目(请参见GPUDevice.createBindGroupLayout()
),dynamicOffsets
中的每个数字都是GPUDevice
的minStorageBufferOffsetAlignment
限制 的倍数。 - 对于每个
bindGroup
条目,绑定buffer
的offset
加上对应布局条目的minBindingSize
加上dynamicOffsets
中指定的对应动态偏移量,小于或等于绑定buffer
的size
。
示例
在我们的 基本计算演示 中,通过 GPUCommandEncoder
记录了多个命令。这些命令中的大多数源自通过 beginComputePass()
创建的 GPUComputePassEncoder
。此处使用的 setBindGroup()
调用是最简单的形式,只指定了索引和绑定组。
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 的浏览器中加载。