GPURenderPassEncoder: executeBundles() 方法
注意:此功能在 Web Workers 中可用。
GPURenderPassEncoder 介面的 executeBundles() 方法執行先前記錄到引用的 GPURenderBundles 中的命令,作為此渲染通道的一部分。
注意: 呼叫 executeBundles() 後,當前設定的頂點緩衝區、索引緩衝區、繫結組和管道都會被清除,即使沒有實際執行任何 bundle。
語法
js
executeBundles(bundles)
引數
bundles-
一個
GPURenderBundle物件陣列,包含要執行的預先錄製的命令。
返回值
無 (Undefined)。
驗證
呼叫 executeBundles() 時必須滿足以下條件,否則將生成 GPUValidationError,並且 GPURenderPassEncoder 會失效。
對於每個 GPURenderBundle
- 如果渲染通道的
depthReadOnly屬性(在原始GPUCommandEncoder.beginRenderPass()呼叫描述符中指定)為true,則 bundle 的depthReadOnly屬性(在建立原始GPURenderBundleEncoder的GPUDevice.createRenderBundleEncoder()呼叫描述符中指定)也必須為true。 - 如果渲染通道的
stencilReadOnly屬性(在原始GPUCommandEncoder.beginRenderPass()呼叫描述符中指定)為true,則 bundle 的stencilReadOnly屬性(在建立原始GPURenderBundleEncoder的GPUDevice.createRenderBundleEncoder()呼叫描述符中指定)也必須為true。 - 在
GPURenderPassEncoder.setPipeline()中指定的渲染管線佈局(在原始GPUDevice.createRenderPipeline()呼叫描述符中定義)與在GPURenderBundleEncoder.setPipeline()中指定的渲染 bundle 管線佈局相等。
示例
在 WebGPU 示例 Animometer 示例中,在許多不同的物件上同時執行了許多類似的操作。executeBundles() 用於在多個渲染通道中重用工作以提高效能。請研究示例程式碼列表以獲取完整上下文。
js
// …
return function doDraw(timestamp) {
if (startTime === undefined) {
startTime = timestamp;
}
uniformTime[0] = (timestamp - startTime) / 1000;
device.queue.writeBuffer(uniformBuffer, timeOffset, uniformTime.buffer);
renderPassDescriptor.colorAttachments[0].view = context
.getCurrentTexture()
.createView();
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
if (settings.renderBundles) {
passEncoder.executeBundles([renderBundle]);
} else {
recordRenderPass(passEncoder);
}
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
};
// …
規範
| 規範 |
|---|
| WebGPU # dom-gpurenderpassencoder-executebundles |
瀏覽器相容性
載入中…