GPURenderPassEncoder: setBindGroup() 方法

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

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

GPURenderPassEncoder 接口的 setBindGroup() 方法为后续渲染命令设置要使用的 GPUBindGroup,并指定其索引。

语法

js
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 值作为 dynamicOffsetssetBindGroup() 调用,如果满足以下条件,则该调用将抛出 RangeError DOMException

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

验证

调用 setBindGroup() 时必须满足以下条件,否则将生成 GPUValidationError,并且 GPURenderPassEncoder 将变为无效

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

示例

在 WebGPU 示例 纹理立方体示例 中,setBindGroup() 用于将 uniformBindGroup 绑定到索引位置 0。查看示例以了解完整上下文。

js
// ...

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 表格仅在浏览器中加载

另请参阅