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 |
浏览器兼容性
加载中…