GPUDevice: createRenderPipelineAsync() 方法
注意:此功能在 Web Workers 中可用。
GPUDevice 接口的 createRenderPipelineAsync() 方法返回一个 Promise,该 Promise 会以一个 GPURenderPipeline 对象 Fulfilled。该对象可以控制顶点和片段着色器阶段,并可在 GPURenderPassEncoder 或 GPURenderBundleEncoder 中使用,一旦流水线无需任何等待即可使用。
注意: 只要有可能,通常更推荐使用此方法而不是 GPUDevice.createRenderPipeline(),因为它能防止 GPU 操作执行因流水线编译而被阻塞。
语法
js
createRenderPipelineAsync(descriptor)
参数
描述符(descriptor)-
请参阅
GPUDevice.createRenderPipeline()方法的描述符定义。
返回值
当创建的流水线准备好即可使用而无需额外延迟时,将以一个 GPURenderPipeline 对象实例 Fulfilled 的 Promise。
验证
如果流水线创建失败,并导致流水线无效,则返回的 Promise 会以一个 GPUPipelineError 被 Rejected。
- 如果这是由于内部错误,则
GPUPipelineError的reason将是"internal"。 - 如果这是由于验证错误,则
GPUPipelineError的reason将是"validation"。
如果以下任何一项不成立,则可能发生验证错误:
- 对于
depthStencil对象format是一个深度或模板格式。- 对于线条和点拓扑,
depthBias、depthBiasClamp和depthBiasSlopeScale属性设置为0,即如果topology设置为"line-list"、"line-strip"或"point-list"。 - 如果
depthWriteEnabled为true或depthCompare不是"always",则format具有深度分量。 - 如果
stencilFront或stencilBack的属性不是其默认值,则format具有模板分量。
- 对于
fragment对象targets.length小于或等于GPUDevice的maxColorAttachments限制。- 对于每个
target,writeMask的数值等价物小于 16。 - 如果使用的任何混合因子操作使用了源 alpha 通道(例如
"src-alpha-saturated"),则输出具有 alpha 通道(即,它必须是一个vec4)。 - 如果省略了
entryPoint属性,则着色器代码包含一个单一的片段着色器入口点函数,供浏览器用作默认入口点。
- 对于
primitive对象- 如果使用了
unclippedDepth属性,则启用了depth-clip-control功能。
- 如果使用了
- 对于
vertex对象- 如果省略了
entryPoint属性,则着色器代码包含一个单一的顶点着色器入口点函数,供浏览器用作默认入口点。
- 如果省略了
示例
注意: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 |
浏览器兼容性
加载中…