GPUDevice: createRenderPipeline() 方法
注意:此功能在 Web Workers 中可用。
GPUDevice 介面的 createRenderPipeline() 方法建立 GPURenderPipeline,可控制頂點和片段著色器階段,並可在 GPURenderPassEncoder 或 GPURenderBundleEncoder 中使用。
語法
createRenderPipeline(descriptor)
引數
描述符(descriptor)-
包含以下屬性的物件:
depthStencil可選-
一個物件(參見
depthStencil物件結構),描述深度模板屬性,包括測試、操作和偏差。 fragment可選-
一個物件(參見
fragment物件結構),描述管線的片段著色器入口點及其輸出顏色。如果未定義片段著色器入口點,管線將不產生任何顏色附件輸出,但仍會執行光柵化並根據頂點位置輸出產生深度值。深度測試和模板操作仍然可以使用。 label可選-
一個字串,提供可用於識別物件的標籤,例如在
GPUError訊息或控制檯警告中。 layout-
定義管線執行期間使用的所有 GPU 資源(緩衝區、紋理等)的佈局(結構、目的和型別)。可能的值包括:
- 一個
GPUPipelineLayout物件,使用GPUDevice.createPipelineLayout()建立,允許 GPU 提前找出如何最有效地執行管線。 - 字串
"auto",這將導致管線根據著色器程式碼中定義的任何繫結生成隱式繫結組佈局。如果使用"auto",生成的繫結組佈局只能與當前管線一起使用。
- 一個
multisample可選-
一個物件(參見
multisample物件結構),描述管線如何與渲染通道的多采樣附件互動。 primitive可選-
一個物件(參見
primitive物件結構),描述管線如何從其頂點輸入構造和光柵化圖元。 頂點(vertex)-
一個物件(參見
vertex物件結構),描述管線的頂點著色器入口點及其輸入緩衝區佈局。
depthStencil 物件結構
depthStencil 物件可以包含以下屬性:
depthBias可選-
一個數字,表示新增到每個片段的常量深度偏差。如果省略,
depthBias預設為 0。注意:對於線和點拓撲,即如果
topology設定為"line-list"、"line-strip"或"point-list",則depthBias、depthBiasClamp和depthBiasSlopeScale屬性必須設定為0。否則,將生成GPUValidationError,並且返回的GPURenderPipeline將無效。 depthBiasClamp可選-
一個數字,表示片段的最大深度偏差。如果省略,
depthBiasClamp預設為 0。 depthBiasSlopeScale可選-
一個數字,表示隨片段斜率縮放的深度偏差。如果省略,
depthBiasSlopeScale預設為 0。 depthCompare可選-
一個列舉值,指定用於將片段深度與
depthStencilAttachment深度值進行測試的比較操作。可能的值為:"never":比較測試永不透過。"less":如果提供的值小於取樣值,則透過比較測試。"equal":如果提供的值等於取樣值,則透過比較測試。"less-equal":如果提供的值小於或等於取樣值,則透過比較測試。"greater":如果提供的值大於取樣值,則透過比較測試。"not-equal":如果提供的值不等於取樣值,則透過比較測試。"greater-equal":如果提供的值大於或等於取樣值,則透過比較測試。"always":比較測試始終透過。
如果指定的
format沒有深度分量,或者未使用比較操作,則不需要depthCompare。 depthWriteEnabled可選-
一個布林值。值為
true表示GPURenderPipeline可以在建立後修改depthStencilAttachment深度值。設定為false表示不能。如果指定的
format沒有深度分量,則不需要depthWriteEnabled。 格式(format)-
一個列舉值,指定
GPURenderPipeline將相容的depthStencilAttachment格式。所有可用的format值請參閱規範的 紋理格式 部分。 stencilBack可選-
一個物件,定義如何對背面圖元執行模板比較和操作。其屬性可以包括:
compare可選-
一個列舉值,指定在將片段與
depthStencilAttachment模板值進行測試時使用的比較操作。可能的值與depthCompare屬性相同;參見上文。如果省略,compare預設為"always"。 depthFailOp可選-
一個列舉值,指定如果
depthCompare描述的片段深度比較失敗時執行的模板操作。可能的值為:"decrement-clamp":遞減當前渲染狀態的模板值,並將其鉗制到 0。"decrement-wrap":遞減當前渲染狀態的模板值,如果值小於 0,則將其迴圈到depthStencilAttachment模板方面的最大可表示值。"invert":按位反轉當前渲染狀態的模板值。"increment-clamp":遞增當前渲染狀態的模板值,並將其鉗制到depthStencilAttachment模板方面的最大可表示值。"increment-wrap":遞增當前渲染狀態的模板值,如果值超過depthStencilAttachment模板方面的最大可表示值,則將其迴圈到 0。"keep":保持當前模板值。"replace":將模板值設定為當前渲染狀態的模板值。"zero":將模板值設定為 0。
如果省略,
depthFailOp預設為"keep"。注意:渲染狀態模板值在渲染通道開始時初始化為 0。
failOp可選-
一個列舉值,指定如果
compare描述的片段模板比較測試失敗時執行的模板操作。可能的值和預設值與depthFailOp相同。 passOp可選-
一個列舉值,指定如果
compare描述的片段模板比較測試透過時執行的模板操作。可能的值和預設值與depthFailOp相同。
stencilFront可選-
一個物件,定義如何對正面圖元執行模板比較和操作。其屬性與
stencilBack相同。 stencilReadMask可選-
一個位掩碼,控制在執行模板比較測試時讀取
depthStencilAttachment模板值的哪些位。如果省略,stencilReadMask預設為0xFFFFFFFF。 stencilWriteMask可選-
一個位掩碼,控制在執行模板操作時寫入
depthStencilAttachment模板值的哪些位。如果省略,stencilWriteMask預設為0xFFFFFFFF。
注意:depthStencilAttachment 值在 GPUCommandEncoder.beginRenderPass() 呼叫期間指定,即 GPURenderPipeline 實際用於執行渲染通道時。
fragment 物件結構
fragment 物件包含一個物件陣列,每個物件可以包含以下屬性:
constants可選-
一系列記錄型別,結構為
(id, value),表示 管線中可被覆蓋的 WGSL 常量 的覆蓋值。這些行為類似於 有序對映。在每種情況下,id是用於識別或選擇記錄的鍵,constant是表示 WGSL 的列舉值。根據要覆蓋的常量,
id可以採用常量的數字 ID 形式(如果已指定),或者常量的識別符號名稱。一個提供多個可覆蓋常量的覆蓋值的程式碼片段可能如下所示:
js({ // … constants: { 0: false, 1200: 3.0, 1300: 2.0, width: 20, depth: -1, height: 15, }, }); entryPoint可選-
module中此階段將用於執行其工作的函式的名稱。相應的著色器函式必須具有@fragment屬性才能被識別為入口點。有關更多資訊,請參閱 入口點宣告。如果著色器程式碼包含一個設定了
@fragment屬性的單個函式,則可以省略entryPoint屬性——瀏覽器將使用它作為預設入口點。如果省略entryPoint且瀏覽器無法確定預設入口點,則會生成GPUValidationError,並且生成的GPURenderPipeline將無效。 模組-
一個
GPUShaderModule物件,包含此可程式設計階段將執行的 WGSL 程式碼。 目標(targets)-
一個物件陣列,表示顏色狀態,這些顏色狀態表示片段著色器階段輸出的顏色的配置細節。這些物件可以包含以下屬性:
blend可選-
一個物件,描述要應用於輸出顏色的混合模式。
blend有兩個屬性:alpha和color都接受一個物件作為值,該物件可以包含以下屬性:dstFactor可選-
一個列舉值,定義要對來自目標附件的值執行的混合因子操作。可能的值為:
"constant""dst""dst-alpha""one""one-minus-dst""one-minus-src""one-minus-src1""one-minus-src-alpha""one-minus-src1-alpha""one-minus-dst-alpha""one-minus-constant""src""src1""src-alpha""src1-alpha""src-alpha-saturated""zero"
如果省略,
dstFactor預設為"zero"。注意:需要啟用
dual-source-blending功能 才能成功使用src1、one-minus-src1、src1-alpha和one-minus-src1-alpha混合因子操作。否則,將生成GPUValidationError。 operation可選-
一個列舉值,定義用於組合源和目標混合因子以計算寫入目標附件元件的最終值的演算法。可能的值為:
"add""max""min""reverse-subtract""subtract"
如果省略,
operation預設為"add"。 srcFactor可選-
一個列舉值,定義要對來自片段著色器的值執行的混合因子操作。可能的值與
dstFactor相同。如果省略,srcFactor預設為"one"。
注意:有關每個
dstFactor/srcFactor和operation列舉值定義的演算法的詳細說明,請參閱規範的 混合狀態 部分。 格式(format)-
一個列舉值,指定輸出顏色所需的格式。所有可用的
format值請參閱規範的 紋理格式 部分。 writeMask可選-
一個或多個 位標誌,定義應用於顏色目標狀態的寫入掩碼。可能的標誌值為:
GPUColorWrite.REDGPUColorWrite.GREENGPUColorWrite.BLUEGPUColorWrite.ALPHAGPUColorWrite.ALL
如果省略,
writeMask預設為GPUColorWrite.ALL。請注意,可以透過使用 按位或 分隔值來指定多個標誌,例如:
GPUColorWrite.RED | GPUColorWrite.ALPHA。
multisample 物件結構
multisample 物件可以包含以下屬性:
alphaToCoverageEnabled可選-
一個布林值。值為
true表示片段的 alpha 通道應用於生成樣本覆蓋掩碼。如果省略,alphaToCoverageEnabled預設為false。 count可選-
一個數字,定義每個畫素的樣本數。管線將僅與具有匹配
sampleCounts的附件紋理(colorAttachment和depthStencilAttachment)(參見GPUTexture)相容。如果省略,
count預設為 1。 mask可選-
一個位掩碼,確定寫入哪些樣本。如果省略,
mask預設為0xFFFFFFFF。
注意:colorAttachment 和 depthStencilAttachment 值在 GPUCommandEncoder.beginRenderPass() 呼叫期間指定,即 GPURenderPipeline 實際用於執行渲染通道時。
primitive 物件結構
primitive 物件可以包含以下屬性:
cullMode可選-
一個列舉值,定義將剔除哪個多邊形方向(如果有)。可能的值為:
"back":剔除背面多邊形。"front":剔除正面多邊形。"none":不剔除任何多邊形。
如果省略,
cullMode預設為"none"。 frontFace可選-
一個列舉值,定義哪些多邊形被認為是正面。可能的值為:
"ccw":頂點幀緩衝區座標以逆時針順序給出多邊形。"cw":頂點幀緩衝區座標以順時針順序給出多邊形。
如果省略,
frontFace預設為"ccw"。注意:
frontFace和cullMode值對"point-list"、"line-list"或"line-strip"拓撲沒有影響。 stripIndexFormat可選-
一個列舉值,在管線具有條帶拓撲(
"line-strip"或"triangle-strip")的情況下,確定索引緩衝區格式和圖元重啟值。圖元重啟值指定哪個索引值表示應該開始一個新的圖元,而不是繼續使用先前的索引頂點構造條帶。可能的值為:"uint16":表示位元組大小為 2,圖元重啟值為0xFFFF。"uint32":表示位元組大小為 4,圖元重啟值為0xFFFFFFFF。
指定條帶圖元拓撲的 GPU 圖元狀態必須在用於索引繪製(例如,透過
GPURenderPassEncoder.drawIndexed())時指定條帶索引格式,以便在管線建立時知道將使用的圖元重啟值。具有列表圖元拓撲("line-list"、"point-list"或"triangle-list")的管線不應指定stripIndexFormat值。它們將轉而使用在進行索引渲染時傳遞給GPURenderPassEncoder.setIndexBuffer()的索引格式。 topology可選-
一個列舉值,定義要從指定的
vertex輸入構造的圖元型別。可能的值為:"line-list":每連續一對兩個頂點定義一個線圖元。"line-strip":第一個頂點後的每個頂點都定義它與前一個頂點之間的線圖元。"point-list":每個頂點定義一個點圖元。"triangle-list":每連續三個頂點定義一個三角形圖元。"triangle-strip":前兩個頂點後的每個頂點都定義它與前兩個頂點之間的三角形圖元。
如果省略,
topology預設為"triangle-list"。 unclippedDepth可選-
一個布林值。值為
true表示停用深度裁剪。如果省略,unclippedDepth預設為false。請注意,要控制深度裁剪,必須在GPUDevice中啟用depth-clip-control功能。注意:需要啟用
depth-clip-control功能 才能成功使用unclippedDepth屬性。否則,將生成GPUValidationError。
vertex 物件結構
vertex 物件可以包含以下屬性:
constants可選-
一系列記錄型別,結構為
(id, value),表示 管線中可被覆蓋的 WGSL 常量 的覆蓋值。這些行為類似於 有序對映。在每種情況下,id是用於識別或選擇記錄的鍵,constant是表示 WGSL 的列舉值。根據要覆蓋的常量,
id可以採用常量的數字 ID 形式(如果已指定),或者常量的識別符號名稱。一個提供多個可覆蓋常量的覆蓋值的程式碼片段可能如下所示:
js({ // … constants: { 0: false, 1200: 3.0, 1300: 2.0, width: 20, depth: -1, height: 15, }, }); entryPoint可選-
module中此階段將用於執行其工作的函式的名稱。相應的著色器函式必須具有@vertex屬性才能被識別為入口點。有關更多資訊,請參閱 入口點宣告。如果著色器程式碼包含一個設定了
@vertex屬性的單個函式,則可以省略entryPoint屬性——瀏覽器將使用它作為預設入口點。如果省略entryPoint且瀏覽器無法確定預設入口點,則會生成GPUValidationError,並且生成的GPURenderPipeline將無效。 模組-
一個
GPUShaderModule物件,包含此可程式設計階段將執行的 WGSL 程式碼。 buffers可選-
一個物件陣列,每個物件表示管線中使用的頂點緩衝區的預期佈局。每個物件可以包含以下屬性:
陣列步長(arrayStride)-
一個數字,表示緩衝區內不同結構(例如,頂點)之間的步長(以位元組為單位)。
attributes-
一個物件陣列,定義每個結構中頂點屬性的佈局。每個物件具有以下屬性:
格式(format)-
一個列舉值,指定頂點的格式。有關所有可用值,請參閱規範中的
GPUVertexFormat定義。 offset-
一個數字,指定從結構開始到屬性資料的偏移量(以位元組為單位)。
著色器位置(shaderLocation)-
與此屬性關聯的數字位置,該位置將與
vertex物件的module屬性中引用的關聯GPUShaderModule的 WGSL 程式碼中宣告的@location屬性相對應。
stepMode可選-
一個列舉值,定義緩衝區內獨立結構是表示頂點還是例項。可能的值為:
"instance":每個結構都是一個例項——每個例項的地址都按arrayStride遞增。"vertex":每個結構都是一個頂點——每個頂點的地址都按arrayStride遞增,並在例項之間重置。
如果省略,
stepMode預設為"vertex"。
返回值
一個 GPURenderPipeline 物件例項。
驗證
呼叫 createRenderPipeline() 時必須滿足以下條件,否則將生成 GPUValidationError 並返回無效的 GPURenderPipeline 物件:
- 對於
depthStencil物件:format是depth-or-stencil格式。- 對於線和點拓撲,即如果
topology設定為"line-list"、"line-strip"或"point-list",則depthBias、depthBiasClamp和depthBiasSlopeScale屬性設定為0。 - 如果
depthWriteEnabled為true或depthCompare不為"always",則format具有深度分量。 - 如果
stencilFront或stencilBack的屬性不為預設值,則format具有模板分量。
- 對於
fragment物件:targets.length小於或等於GPUDevice的maxColorAttachments限制。- 對於每個
target,writeMask的數值等價小於 16。 - 如果任何使用的混合因子操作使用源 alpha 通道(例如
"src-alpha-saturated"),則輸出具有 alpha 通道(即,它必須是vec4)。 - 如果使用
src1、one-minus-src1、src1-alpha或one-minus-src1-alpha混合因子操作,則啟用dual-source-blending功能。 - 如果省略
entryPoint屬性,則著色器程式碼包含單個片段著色器入口點函式供瀏覽器用作預設入口點。
- 對於
primitive物件:- 如果使用
unclippedDepth屬性,則啟用depth-clip-control功能。
- 如果使用
- 對於
vertex物件:- 如果省略
entryPoint屬性,則著色器程式碼包含單個頂點著色器入口點函式供瀏覽器用作預設入口點。
- 如果省略
示例
注意:WebGPU 示例 提供了更多示例。
基本示例
我們的基本渲染演示 提供了一個有效渲染管線描述符物件的構建示例,該物件隨後透過 createRenderPipeline() 呼叫用於建立 GPURenderPipeline。
// …
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 = device.createRenderPipeline(pipelineDescriptor);
// …
規範
| 規範 |
|---|
| WebGPU # dom-gpudevice-createrenderpipeline |
瀏覽器相容性
載入中…