GPURenderPassEncoder: executeBundles() 方法
executeBundles()
是 GPURenderPassEncoder
接口的方法,用于在此渲染传递过程中执行先前记录到引用的 GPURenderBundle
中的命令。
注意: 调用 executeBundles()
后,当前设置的顶点缓冲区、索引缓冲区、绑定组和管道都将被清除,即使实际上没有执行任何捆绑包也是如此。
语法
js
executeBundles(bundles)
参数
bundles
-
一个包含要执行的预记录命令的
GPURenderBundle
对象数组。
返回值
无 (Undefined
)。
验证
调用 executeBundles()
时必须满足以下条件,否则将生成 GPUValidationError
,并且 GPURenderPassEncoder
将变为无效。
对于每个 GPURenderBundle
- 如果渲染传递的
depthReadOnly
属性(在原始GPUCommandEncoder.beginRenderPass()
调用的描述符中指定)为true
,则捆绑包的depthReadOnly
属性(在创建原始GPURenderBundleEncoder
的GPUDevice.createRenderBundleEncoder()
调用的描述符中指定)也为true
。 - 如果渲染传递的
stencilReadOnly
属性(在原始GPUCommandEncoder.beginRenderPass()
调用的描述符中指定)为true
,则捆绑包的stencilReadOnly
属性(在创建原始GPURenderBundleEncoder
的GPUDevice.createRenderBundleEncoder()
调用的描述符中指定)也为true
。 - 在
GPURenderPassEncoder.setPipeline()
中指定的渲染管道的布局(在原始GPUDevice.createRenderPipeline()
调用的描述符中定义)等于在GPURenderBundleEncoder.setPipeline()
中指定的渲染捆绑包管道的布局。
示例
在 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 |
浏览器兼容性
BCD 表格仅在浏览器中加载
另请参阅
- The WebGPU API