GPUDevice: createBindGroupLayout() 方法
注意:此功能在 Web Workers 中可用。
createBindGroupLayout() 方法是 GPUDevice 接口的一个方法,它创建一个 GPUBindGroupLayout 对象,该对象定义了将在流水线中使用的相关 GPU 资源(例如缓冲区)的结构和用途,并用作创建 GPUBindGroups 的模板。
语法
createBindGroupLayout(descriptor)
参数
描述符(descriptor)-
包含以下属性的对象:
entries-
一个 条目对象 数组,每个对象描述一个要包含在
GPUBindGroupLayout中的单独着色器资源绑定。每个条目将对应于使用此GPUBindGroupLayout对象作为模板创建的GPUBindGroup(通过GPUDevice.createBindGroup()调用创建)中定义的条目。 label可选-
一个字符串,提供可用于识别对象的标签,例如在
GPUError消息或控制台警告中。
条目对象
一个条目对象包含以下属性
binding-
一个数字,代表此特定条目的唯一标识符,与相应
GPUBindGroup条目的binding值匹配。此外,它还与相应流水线中使用的着色器(GPUShaderModule)中@binding(n)属性的n索引值匹配。 visibility-
一个或多个 按位标志,定义与此条目对应的
GPUBindGroup条目可访问的着色器阶段。可能的值为:GPUShaderStage.COMPUTE:绑定组条目可被计算着色器访问。GPUShaderStage.FRAGMENT:绑定组条目可被片段着色器访问。GPUShaderStage.VERTEX:绑定组条目可被顶点着色器访问。
请注意,可以通过使用 按位 OR 分隔值来指定多个阶段,例如:
GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX。 - "Resource layout object"
-
一个对象,用于定义此条目对应的
GPUBindGroup条目所需的绑定资源类型和结构。此属性可以是buffer、externalTexture、sampler、storageTexture或texture之一,它们的结构将在下一节中进行描述。
资源布局对象
资源布局对象可以是以下类型之一(有关每个条目所需资源的结构,请参见 GPUDevice.createBindGroup())。
-
buffer:表示相应的GPUBindGroup条目将是一个GPUBufferBinding对象,其中包含一个GPUBuffer以及offset和size值。buffer资源布局对象可以包含以下属性:hasDynamicOffset可选-
一个布尔值。如果设置为
true,则表示此绑定需要动态偏移,例如在GPURenderPassEncoder.setBindGroup()调用中设置。如果省略,hasDynamicOffset默认为false。 minBindingSize可选-
一个数字,表示所绑定缓冲区的最小允许大小(以字节为单位)。如果省略,
minBindingSize默认为 0。如果值为 0,则在创建流水线时会忽略最小缓冲区大小,而是在发出绘制/调度命令时进行验证。 type可选-
一个枚举值,指定绑定到此绑定的
GPUBuffer的所需类型(有关缓冲区类型的更多信息,请参阅GPUDevice.createBuffer())。可能的值为:"read-only-storage":一个使用usage为GPUBufferUsage.STORAGE创建的只读缓冲区。"storage":一个使用usage为GPUBufferUsage.STORAGE创建的可写缓冲区。"uniform":一个使用usage为GPUBufferUsage.UNIFORM创建的缓冲区。
如果省略,
type默认为"uniform"。
-
externalTexture:表示相应的GPUBindGroup条目将是一个GPUExternalTexture对象。externalTexture资源布局对象是空的 —{}。 -
sampler:表示相应的GPUBindGroup条目将是一个GPUSampler对象。sampler资源布局对象可以包含以下属性:type可选-
一个枚举值,指定绑定到此绑定的
GPUSampler的所需类型(有关采样器类型的更多信息,请参阅GPUDevice.createSampler())。可能的值为:"comparison":一个比较采样器。"filtering":一个过滤采样器。"non-filtering":一个非过滤采样器。
如果省略,
type默认为"filtering"。
-
storageTexture:表示相应的GPUBindGroup条目将是一个GPUTextureView对象。storageTexture资源布局对象可以包含以下属性:access可选-
一个枚举值,指定绑定到此绑定的纹理视图是用于读取和/或写入访问。可能的值为:
"read-only":允许 WGSL 代码读取存储纹理。"read-write":允许 WGSL 代码读取和写入存储纹理。"write-only":默认值;允许 WGSL 代码写入存储纹理。
仅当
"readonly_and_readwrite_storage_textures"WGSL 语言扩展存在于WGSLLanguageFeatures中时,才能使用"read-only"和"read-write"值。如果不是这种情况,将生成一个GPUValidationError。 格式(format)-
一个枚举值,指定绑定到此绑定的纹理视图的所需格式。有关所有可用的
format值,请参阅规范的 纹理格式 部分。 viewDimension可选-
一个枚举值,指定绑定到此绑定的纹理视图的所需维度。可能的值为:
"1d":纹理被视为一维图像。"2d":纹理被视为单个二维图像。"2d-array":纹理被视为二维图像的数组。"cube":纹理被视为立方体贴图。该视图有 6 个数组层,对应于立方体的[+X, -X, +Y, -Y, +Z, -Z]面。采样在立方体贴图的面之间无缝进行。"cube-array":纹理被视为n个立方体贴图的打包数组,每个立方体贴图有 6 个数组层,对应于立方体的[+X, -X, +Y, -Y, +Z, -Z]面。采样在立方体贴图的面之间无缝进行。"3d":纹理被视为三维图像。
如果省略,
viewDimension默认为"2d"。
-
texture:表示相应的GPUBindGroup条目将是一个GPUTextureView对象。texture资源布局对象可以包含以下属性:multisampled可选-
一个布尔值。值为
true表示绑定到此绑定的纹理视图必须是多重采样的。如果省略,multisampled默认为false。 sampleType可选-
一个枚举值,指定绑定到此绑定的纹理视图所需的采样类型(有关纹理视图类型的更多信息,请参阅
GPUDevice.createTexture())。可能的值为:"depth""float""sint""uint""unfilterable-float"
如果省略,
sampleType默认为"float"。 viewDimension可选-
一个枚举值,指定绑定到此绑定的纹理视图的所需维度。可能值和默认值与
storageTexture资源布局对象相同 — 参见上文。
返回值
一个 GPUBindGroupLayout 对象实例。
验证
调用 createBindGroupLayout() 时必须满足以下条件,否则将生成一个 GPUValidationError 并返回一个无效的 GPUBindGroupLayout 对象:
- 每个条目的
binding值是唯一的。 - 每个条目的
binding值小于GPUDevice的maxBindingsPerBindGroup限制。 - 条目数量不超过 绑定槽限制。
- 每个条目只定义 1 个资源布局对象。
- 如果条目的
visibility包含GPUShaderStage.VERTEX:- 如果其资源布局对象是
buffer,则其type不是"storage"。 - 其资源布局对象不是
storageTexture。
- 如果其资源布局对象是
- 如果条目的资源布局对象是
texture,并且其multisampled值为true:- 其
viewDimension为"2d"。 - 其
sampleType不是"float"。
- 其
- 如果条目的资源布局对象是
storageTexture:- 其
viewDimension不是"cube"或"cube-array"。 - 其
format是支持存储使用的格式。
- 其
示例
注意:WebGPU 示例 提供了更多示例。
基本示例
我们的 基本计算演示 展示了如何创建绑定组布局,然后将其用作创建绑定组的模板的示例。
// …
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-createbindgrouplayout |
浏览器兼容性
加载中…