GPUDevice: createRenderPipelineAsync() 方法
GPUDevice
接口的 createRenderPipelineAsync()
方法返回一个 Promise
,该 Promise 使用一个 GPURenderPipeline
填充,该管道可以控制顶点和片段着色器阶段,并且可以在 GPURenderPassEncoder
或 GPURenderBundleEncoder
中使用,一旦管道可以使用而不会有任何停顿。
注意: 只要有可能,一般来说最好使用此方法而不是 GPUDevice.createRenderPipeline()
,因为它可以防止在管道编译时阻塞 GPU 操作执行。
语法
js
createRenderPipelineAsync(descriptor)
参数
descriptor
-
有关
GPUDevice.createRenderPipeline()
方法的描述符定义,请参见描述符定义。
返回值
一个 Promise
,当创建的管道准备好在没有额外延迟的情况下使用时,该 Promise 将使用一个 GPURenderPipeline
对象实例填充。
验证
如果管道创建失败,导致生成的管道无效,则返回的 promise 将使用 GPUPipelineError
拒绝。
- 如果这是由于内部错误,则
GPUPipelineError
将具有"internal"
的reason
。 - 如果这是由于验证错误,则
GPUPipelineError
将具有"validation"
的reason
。
如果以下任何一项为假,则可能会发生验证错误
- 对于
depthStencil
对象format
是depth-or-stencil
格式。- 如果
depthWriteEnabled
为true
或depthCompare
不为"always"
,则format
具有深度组件。 - 如果
stencilFront
或stencilBack
的属性不处于其默认值,则format
具有模板组件。
- 对于
fragment
对象
示例
注意: WebGPU 示例 提供了许多其他示例。
基本示例
以下示例展示了构建有效渲染管道描述符对象的示例,然后使用该对象通过 createRenderPipelineAsync()
调用创建 GPURenderPipeline
。
js
async function init() {
// ...
const vertexBuffers = [
{
attributes: [
{
shaderLocation: 0, // position
offset: 0,
format: "float32x4",
},
{
shaderLocation: 1, // color
offset: 16,
format: "float32x4",
},
],
arrayStride: 32,
stepMode: "vertex",
},
];
const pipelineDescriptor = {
vertex: {
module: shaderModule,
entryPoint: "vertex_main",
buffers: vertexBuffers,
},
fragment: {
module: shaderModule,
entryPoint: "fragment_main",
targets: [
{
format: navigator.gpu.getPreferredCanvasFormat(),
},
],
},
primitive: {
topology: "triangle-list",
},
layout: "auto",
};
const renderPipeline =
await device.createRenderPipelineAsync(pipelineDescriptor);
// ...
}
规范
规范 |
---|
WebGPU # dom-gpudevice-createrenderpipelineasync |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。