GPURenderPassEncoder: setBindGroup() 方法
GPURenderPassEncoder
接口的 setBindGroup()
方法为后续渲染命令设置要使用的 GPUBindGroup
,并指定其索引。
语法
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
参数
index
-
设置绑定组的索引。这与着色器代码(
GPUShaderModule
)中相应@group(n)
属性的n
索引值匹配,该着色器代码用于相关的管道。 bindGroup
-
用于后续渲染命令的
GPUBindGroup
。 dynamicOffsets
可选-
一个值,指定
bindGroup
中每个hasDynamicOffset: true
设置的条目的偏移量(以字节为单位)(即,在创建bindGroup
所基于的GPUBindGroupLayout
对象的GPUDevice.createBindGroupLayout()
调用中的描述符中)。此值可以是- 一个数字数组,指定不同的偏移量。
- 一个
Uint32Array
,包含指定偏移量的数字。
如果为 dynamicOffsets
指定了 Uint32Array
值,则以下两个参数也必须提供
dynamicOffsetsStart
-
一个数字,指定
dynamicOffsetsData
中动态偏移量数据开始的偏移量(以数组元素为单位)。 dynamicOffsetsLength
-
一个数字,指定要从
dynamicOffsetsData
中读取的动态偏移量值的个数。
返回值
无(Undefined
)。
异常
对于使用 Uint32Array
值作为 dynamicOffsets
的 setBindGroup()
调用,如果满足以下条件,则该调用将抛出 RangeError
DOMException
dynamicOffsetsStart
小于 0。dynamicOffsetsStart
+dynamicOffsetsLength
大于dynamicOffsets.length
。
验证
调用 setBindGroup()
时必须满足以下条件,否则将生成 GPUValidationError
,并且 GPURenderPassEncoder
将变为无效
index
小于或等于GPUDevice
的maxBindGroups
限制。dynamicOffsets.length
与bindGroup
中hasDynamicOffset: true
设置的条目的数量相同。- 对于
bindGroup
中绑定buffer
的type
为"uniform"
的条目(请参见GPUDevice.createBindGroupLayout()
),dynamicOffsets
中的每个数字都是GPUDevice
的minUniformBufferOffsetAlignment
限制 的倍数。 - 对于
bindGroup
中绑定buffer
的type
为"storage"
或"read-only-storage"
的条目(请参见GPUDevice.createBindGroupLayout()
),dynamicOffsets
中的每个数字都是GPUDevice
的minStorageBufferOffsetAlignment
限制 的倍数。 - 对于每个
bindGroup
条目,绑定buffer
的offset
加上相应布局条目的minBindingSize
加上dynamicOffsets
中指定的相应动态偏移量,小于或等于绑定buffer
的size
。
示例
在 WebGPU 示例 纹理立方体示例 中,setBindGroup()
用于将 uniformBindGroup
绑定到索引位置 0。查看示例以了解完整上下文。
// ...
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
passEncoder.setBindGroup(0, uniformBindGroup);
passEncoder.setVertexBuffer(0, verticesBuffer);
passEncoder.draw(cubeVertexCount, 1, 0, 0);
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
// ...
注意:请研究其他 WebGPU 示例 以获取更多 setBindGroup()
用法的示例。
规范
规范 |
---|
WebGPU # programmable-passes-bind-groups |
浏览器兼容性
BCD 表格仅在浏览器中加载