GPUDevice: createRenderBundleEncoder() 方法
注意:此功能在 Web Workers 中可用。
createRenderBundleEncoder() 方法是 GPUDevice 介面的一個方法,用於建立一個 GPURenderBundleEncoder,它可用於預先記錄命令束。這些命令束可以透過 GPURenderPassEncoder 的 executeBundles() 方法,根據需要重複使用任意多次。
語法
createRenderBundleEncoder(descriptor)
引數
描述符(descriptor)-
包含以下屬性的物件:
colorFormats-
一個列舉值陣列,指定渲染目標的預期顏色格式。可能的值請參閱規範中
GPUTextureFormat定義。 depthReadOnly可選-
一個布林值。如果為
true,則指定執行由GPURenderBundleEncoder建立的任何GPURenderBundle時,不會修改depthStencilFormat的深度分量。如果省略,depthReadOnly預設為false。 depthStencilFormat可選-
一個列舉值,指定渲染目標的預期深度或模板格式。可能的值請參閱規範中 深度-模板格式 部分。
label可選-
一個字串,提供可用於識別物件的標籤,例如在
GPUError訊息或控制檯警告中。 sampleCount可選-
一個數字,表示渲染目標的預期取樣計數。
stencilReadOnly可選-
一個布林值。如果為
true,則指定執行由GPURenderBundleEncoder建立的任何GPURenderBundle時,不會修改depthStencilFormat的模板分量。如果省略,stencilReadOnly預設為false。
返回值
一個 GPURenderBundleEncoder 物件例項。
示例
在 WebGPU Samples 的 Animometer 示例中,許多相似的操作同時應用於許多不同的物件。命令束是使用以下函式進行編碼的:
function recordRenderPass(
passEncoder: GPURenderBundleEncoder | GPURenderPassEncoder
) {
if (settings.dynamicOffsets) {
passEncoder.setPipeline(dynamicPipeline);
} else {
passEncoder.setPipeline(pipeline);
}
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setBindGroup(0, timeBindGroup);
const dynamicOffsets = [0];
for (let i = 0; i < numTriangles; ++i) {
if (settings.dynamicOffsets) {
dynamicOffsets[0] = i * alignedUniformBytes;
passEncoder.setBindGroup(1, dynamicBindGroup, dynamicOffsets);
} else {
passEncoder.setBindGroup(1, bindGroups[i]);
}
passEncoder.draw(3, 1, 0, 0);
}
}
稍後,使用 createRenderBundleEncoder() 建立一個 GPURenderBundleEncoder,呼叫該函式,然後使用 GPURenderBundleEncoder.finish() 將命令束記錄到 GPURenderBundle 中。
const renderBundleEncoder = device.createRenderBundleEncoder({
colorFormats: [presentationFormat],
});
recordRenderPass(renderBundleEncoder);
const renderBundle = renderBundleEncoder.finish();
然後使用 GPURenderPassEncoder.executeBundles() 在多個渲染通道中重用該工作以提高效能。請參閱示例程式碼列表以獲取完整上下文。
// …
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-gpudevice-createrenderbundleencoder |
瀏覽器相容性
載入中…