GPUCommandEncoder: beginRenderPass() 方法
注意:此功能在 Web Workers 中可用。
GPUCommandEncoder 介面的 beginRenderPass() 方法開始編碼渲染通道,並返回一個可用於控制渲染的 GPURenderPassEncoder。
語法
beginRenderPass(descriptor)
引數
描述符(descriptor)-
包含以下屬性的物件:
colorAttachments-
一個物件陣列(參見顏色附件物件結構),定義了執行此渲染通道時將輸出到的顏色附件。
depthStencilAttachment可選-
一個物件(參見深度/模板附件物件結構),定義了執行此渲染通道時將輸出到和進行測試的深度/模板附件。
label可選-
一個字串,提供可用於識別物件的標籤,例如在
GPUError訊息或控制檯警告中。 maxDrawCount可選-
一個數字,表示將在渲染通道中執行的最大繪製呼叫次數。某些實現會使用此值來確定在渲染通道之前注入的工作量。除非您知道將執行更多繪製呼叫,否則應保留預設值 — 50000000。
occlusionQuerySet可選-
將儲存此通道的遮擋查詢結果的
GPUQuerySet。 timestampWrites可選-
一個物件陣列,定義此通道的時間戳查詢值寫入的位置和時間。這些物件具有以下屬性
querySet-
一個型別為
"timestamp"的GPUQuerySet,時間戳查詢結果將寫入其中。 beginningOfPassWriteIndex-
一個數字,指定
querySet中寫入渲染通道開始時的時間戳的查詢索引。這是可選的 — 如果未定義,則不會寫入通道開始時的時間戳。 endOfPassWriteIndex-
一個數字,指定
querySet中寫入渲染通道結束時的時間戳的查詢索引。這是可選的 — 如果未定義,則不會寫入通道結束時的時間戳。
注意:需要啟用
timestamp-query功能才能使用時間戳查詢。時間戳查詢值以納秒為單位寫入,但值的確定方式是實現定義的。
顏色附件物件結構
顏色附件物件可以具有以下屬性
clearValue可選-
在執行渲染通道之前,用於清除
view紋理的顏色值。如果loadOp未設定為"clear",則此值將被忽略。clearValue接受一個數組或物件,表示四個顏色分量r、g、b和a的小數。例如,您可以傳入一個數組,如
[0.0, 0.5, 1.0, 1.0],或其等效物件{ r: 0.0, g: 0.5, b: 1.0, a: 1.0 }。如果省略
clearValue,則預設為{ r: 0, g: 0, b: 0, a: 0 }。 depthSlice可選-
一個數字,表示此顏色附件將輸出到的 3D 深度切片的索引,適用於 3D
GPUTextureViewview。指定此項後,WebGPU 可以在渲染通道內直接渲染到 3D 紋理的切片。 loadOp-
一個列舉值,指示在執行渲染通道之前對
view執行的載入操作。可能的值為"clear":將此附件的clearValue載入到渲染通道中。"load":將此附件的現有值載入到渲染通道中。
注意:建議在初始值無關緊要的情況下始終使用
"clear",因為它會在某些裝置(如移動裝置)上提供更好的效能。 storeOp-
一個列舉值,指示在執行渲染通道之後對
view執行的儲存操作。可能的值為"discard":丟棄此附件的渲染通道的最終值。"store":儲存此附件的渲染通道的最終值。
resolveTarget可選-
一個物件,表示如果
view是多重取樣的,將接收此顏色附件解析輸出的紋理子資源。這可以是以下之一GPUTextureViewGPUTexture:可以代替GPUTextureView使用,前提是需要預設檢視。在此上下文中,GPUTexture等同於使用不帶引數的GPUTexture.createView()呼叫建立的GPUTextureView物件。
view-
一個物件,表示此顏色附件將輸出到的紋理子資源。這可以是以下之一
GPUTextureViewGPUTexture:可以代替GPUTextureView使用,前提是需要預設檢視。在此上下文中,GPUTexture等同於使用不帶引數的GPUTexture.createView()呼叫建立的GPUTextureView物件。
注意:每個顏色或深度/模板附件必須是唯一的紋理子資源,並且用作附件的紋理子資源不能在渲染通道內使用。
深度/模板附件物件結構
depthStencilAttachment 物件可以具有以下屬性
depthClearValue可選-
一個數字,表示在執行渲染通道之前清除
view深度分量的值。如果depthLoadOp未設定為"clear",則此值將被忽略。該值必須在 0.0 到 1.0 之間(包括 0.0 和 1.0)。
depthLoadOp可選-
一個列舉值,指示在執行渲染通道之前對
view深度分量執行的載入操作。可能的值為"clear":將此附件的clearValue載入到渲染通道中。"load":將此附件的現有值載入到渲染通道中。
注意:建議在初始值無關緊要的情況下始終使用
"clear",因為它會在某些裝置(如移動裝置)上提供更好的效能。 depthReadOnly可選-
一個布林值。將此值設定為
true會使view的深度分量變為只讀。如果省略depthReadOnly,則預設為false。 depthStoreOp可選-
一個列舉值,指示在執行渲染通道之後對
view深度分量執行的儲存操作。可能的值為"discard":丟棄此附件的渲染通道的最終值。"store":儲存此附件的渲染通道的最終值。
stencilClearValue可選-
一個數字,表示在執行渲染通道之前清除
view模板分量的值。如果stencilLoadOp未設定為"clear",則此值將被忽略。如果省略
stencilClearValue,則預設為 0。 stencilLoadOp可選-
一個列舉值,指示在執行渲染通道之前對
view模板分量執行的載入操作。可能的值為"clear":將此附件的clearValue載入到渲染通道中。"load":將此附件的現有值載入到渲染通道中。
注意:建議在初始值無關緊要的情況下始終使用
"clear",因為它會在某些裝置(如移動裝置)上提供更好的效能。 stencilReadOnly可選-
一個布林值。將此值設定為
true會使view的模板分量變為只讀。如果省略stencilReadOnly,則預設為false。 stencilStoreOp可選-
一個列舉值,指示在執行渲染通道之後對
view模板分量執行的儲存操作。可能的值為"discard":丟棄此附件的渲染通道的最終值。"store":儲存此附件的渲染通道的最終值。
view-
一個物件,表示此深度/模板附件將輸出到和讀取的紋理子資源。這可以是以下之一
GPUTextureViewGPUTexture:可以代替GPUTextureView使用,前提是需要預設檢視。在此上下文中,GPUTexture等同於使用不帶引數的GPUTexture.createView()呼叫建立的GPUTextureView物件。
返回值
一個 GPURenderPassEncoder 物件例項。
驗證
呼叫 beginRenderPass() 時必須滿足以下條件,否則將生成 GPUValidationError 並返回一個無效的 GPURenderPassEncoder。
通用
colorAttachments.length小於或等於GPUDevice的maxColorAttachments限制。- 如果
colorAttachments僅包含null值,則提供了depthStencilAttachment。 colorAttachments和depthStencilAttachment中的所有view都具有相同的GPUTexture.sampleCount值和渲染範圍(GPUTexture.height、GPUTexture.width和GPUTexture.depthOrArrayLayers)。- 如果設定了
occlusionQuerySet,則引用的GPUQuerySet的type為"occlusion"。
對於顏色附件物件
view是可渲染的,並且view的格式(即,在原始GPUTexture.createView()呼叫的描述符中指定)是顏色可渲染格式。- 如果提供了
resolveTargetview的原始GPUTexture的sampleCount大於 1。resolveTarget的原始GPUTexture的sampleCount為 1。resolveTarget是可渲染的。view和resolveTarget提供的子資源大小匹配。view和resolveTarget的格式匹配。
- 每個樣本的顏色附件位元組數小於或等於
GPUDevice的maxColorAttachmentBytesPerSample限制。
對於深度/模板附件物件
view是可渲染的,其格式是深度或模板格式。- 如果
depthLoadOp設定為"clear",則提供了有效的depthClearValue。 - 如果
view的格式是組合的深度或模板格式,則depthReadOnly與stencilReadOnly匹配。 - 如果
view的格式具有深度方面,並且depthReadOnly為false,則提供了depthLoadOp和depthStoreOp。 - 如果
view的格式具有深度方面,並且depthReadOnly為true,則不提供depthLoadOp和depthStoreOp。 - 如果
view的格式具有模板方面,並且stencilReadOnly為false,則提供了stencilLoadOp和stencilStoreOp。 - 如果
view的格式具有模板方面,並且stencilReadOnly為true,則不提供stencilLoadOp和stencilStoreOp。
對於時間戳查詢
GPUDevice中啟用了timestamp-query功能。
示例
在我們的基本渲染演示中,透過 GPUCommandEncoder 記錄了許多命令。這些命令源於透過 beginRenderPass() 建立的 GPURenderPassEncoder
// …
// Create GPUCommandEncoder
const commandEncoder = device.createCommandEncoder();
// Create GPURenderPassDescriptor to tell WebGPU which texture to draw into, then initiate render pass
const renderPassDescriptor = {
colorAttachments: [
{
clearValue: clearColor,
loadOp: "clear",
storeOp: "store",
view: context.getCurrentTexture().createView(),
},
],
};
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
// Draw a triangle
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.draw(3);
// End the render pass
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
// …
規範
| 規範 |
|---|
| WebGPU # dom-gpucommandencoder-beginrenderpass |
瀏覽器相容性
載入中…