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 |
瀏覽器相容性
載入中…