GPUDevice: createBindGroup() 方法

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

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

createBindGroup() 方法是 GPUDevice 接口的一部分,用于根据 GPUBindGroupLayout 创建一个 GPUBindGroupGPUBindGroupLayout 定义了一组要绑定在一起的资源以及这些资源如何在着色器阶段中使用。

语法

js
createBindGroup(descriptor)

参数

descriptor

一个包含以下属性的对象

entries

一个描述要公开给着色器的资源的条目对象的数组。对于 layout 中引用的 GPUBindGroupLayout 中描述的每个对应条目,都会有一个条目对象。每个条目对象都具有以下属性

binding

一个表示此资源绑定的唯一标识符的数字,与 GPUBindGroupLayout 对应条目的 binding 值匹配。此外,它还与着色器(GPUShaderModule)中对应 @binding(n) 属性的 n 索引值匹配,该着色器用于相关管道。

resource

要绑定的资源。可以是以下之一

label 可选

一个字符串,提供一个标签,可用于标识对象,例如在 GPUError 消息或控制台警告中。

layout

此绑定组的 entries 将符合的 GPUBindGroupLayout

GPUBufferBinding 对象

GPUBufferBinding 对象可以包含以下属性

buffer

要绑定的 GPUBuffer 对象。

offset 可选

buffer 的开头到缓冲区绑定向着色器公开的范围的开头的偏移量(以字节为单位)。如果省略,则 offset 默认为 0。

size 可选

缓冲区绑定的大小(以字节为单位)。如果省略,则 size 将是从 offset 开始到 buffer 末尾的范围。如果 offsetsize 都省略,则整个缓冲区都将公开给着色器。

返回值

一个 GPUBindGroup 对象实例。

验证

调用 createBindGroup() 时必须满足以下条件,否则将生成 GPUValidationError 并返回一个无效的 GPUBindGroup 对象

  • layout GPUBindGroupLayout 中的条目数等于 entries 中的条目对象数。
  • 对于 layout GPUBindGroupLayout 中的每个条目,entries 中对应的条目对象都会绑定正确的资源类型。例如,buffer 资源布局对象在对应的绑定中指定了一个 GPUBufferBinding 对象。
  • 如果资源布局对象是 buffer
    • 对应的绑定 GPUBuffer
      • 其绑定部分(由 offsetsize 指定)完全包含在其中,大小不为零。
      • 其大小大于 buffer 资源布局的 minBindingSize
    • 如果资源布局对象的 type"uniform"
      • 绑定的 GPUBufferusage 包含 GPUBufferUsage.UNIFORM
      • 绑定缓冲区段的有效大小小于或等于 GPUDevicemaxUniformBufferBindingSize 限制
      • 指定的 GPUBufferBinding offsetGPUDeviceminUniformBufferOffsetAlignment 限制 的倍数。
    • 如果资源布局对象的 type"storage""read-only-storage"
      • 绑定的 GPUBufferusage 包含 GPUBufferUsage.STORAGE
      • 绑定缓冲区段的有效大小小于或等于 GPUDevicemaxStorageBufferBindingSize 限制
      • 绑定缓冲区段的有效大小是 4 的倍数。
      • 指定的 GPUBufferBinding offsetGPUDeviceminStorageBufferOffsetAlignment 限制 的倍数。
  • 如果资源布局对象是 storageTexture,则对应的绑定 GPUTextureView
    • dimension 等于资源布局对象的 viewDimension(有关纹理视图设置的更多详细信息,请参阅 GPUTexture.createView())。
    • format 等于资源布局对象的 sampleType
    • mipLevelCount 等于 1。
    • GPUTexture 的视图,其 usage 包含 GPUTextureUsage.STORAGE_BINDING
  • 如果资源布局对象是 texture,则对应的绑定 GPUTextureView
    • dimension 等于资源布局对象的 viewDimension(有关纹理视图设置的更多详细信息,请参阅 GPUTexture.createView())。
    • format 与资源布局对象的 sampleType 兼容。
    • GPUTexture 的视图,其 usage 包含 GPUTextureUsage.TEXTURE_BINDING
    • GPUTexture 的视图,如果资源布局对象的 multisampled 属性为 true,则其 sampleCount 大于 1,如果为 false,则等于 1。

示例

注意:WebGPU 示例 提供了更多示例。

基本示例

我们的 基本计算演示 展示了创建绑定组布局,然后将其用作创建绑定组时的模板的示例。

js
// ...

const bindGroupLayout = device.createBindGroupLayout({
  entries: [
    {
      binding: 0,
      visibility: GPUShaderStage.COMPUTE,
      buffer: {
        type: "storage",
      },
    },
  ],
});

const bindGroup = device.createBindGroup({
  layout: bindGroupLayout,
  entries: [
    {
      binding: 0,
      resource: {
        buffer: output,
      },
    },
  ],
});

// ...

规范

规范
WebGPU
# dom-gpudevice-createbindgroup

浏览器兼容性

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

另请参阅