GPUDevice: createPipelineLayout() 方法
注意:此功能在 Web Workers 中可用。
GPUDevice 接口的 createPipelineLayout() 方法创建一个 GPUPipelineLayout,该方法定义了管线所使用的 GPUBindGroupLayout。在命令编码过程中与管线一起使用的 GPUBindGroup 必须具有兼容的 GPUBindGroupLayout。
语法
js
createPipelineLayout(descriptor)
参数
描述符(descriptor)-
包含以下属性的对象:
bindGroupLayouts-
一个代表管线绑定组布局的数组。每个值可以是
- 一个
GPUBindGroupLayout对象,通过调用GPUDevice.createBindGroupLayout()创建。每个对象对应于相关管线中使用的GPUShaderModule所包含的着色器代码中的@group属性。 null,表示一个空的绑定组布局。在创建管线布局时会忽略null值。
- 一个
label可选-
一个字符串,提供可用于识别对象的标签,例如在
GPUError消息或控制台警告中。
返回值
一个 GPUPipelineLayout 对象实例。
验证
调用 createPipelineLayout() 时必须满足以下条件,否则会生成 GPUValidationError 并返回一个无效的 GPUPipelineLayout 对象。
bindGroupLayouts中的GPUBindGroupLayout对象有效。bindGroupLayouts中的GPUBindGroupLayout对象数量少于GPUDevice的maxBindGroups限制。
示例
注意:WebGPU 示例 提供了更多示例。
多个绑定组布局、绑定组和管线布局
以下代码片段
- 创建一个
GPUBindGroupLayout,描述了对一个缓冲区、一个纹理和一个采样器的绑定。 - 基于
GPUBindGroupLayout创建一个GPUPipelineLayout。
js
// …
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
buffer: {},
},
{
binding: 1,
visibility: GPUShaderStage.FRAGMENT,
texture: {},
},
{
binding: 2,
visibility: GPUShaderStage.FRAGMENT,
sampler: {},
},
],
});
const pipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout],
});
// …
指定一个空的绑定组布局
在此代码片段中,我们创建了三个绑定组布局,其中绑定组布局 1 代表片段数据,绑定组布局 2 代表顶点数据。如果我们想创建一个只使用绑定组布局 0 和 2 的管线,我们可以为绑定组布局 1 传递 null,然后渲染而无需片段着色器。
js
const bgl0 = device.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = device.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = device.createBindGroupLayout({ entries: myVertexEntries });
// pipeline layout can be used to render without a fragment shader
const pipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bgl0, null, bgl2],
});
规范
| 规范 |
|---|
| WebGPU # dom-gpudevice-createpipelinelayout |
浏览器兼容性
加载中…