GPUDevice: createRenderBundleEncoder() 方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

注意:此功能在 Web Workers 中可用。

createRenderBundleEncoder() 方法是 GPUDevice 介面的一個方法,用於建立一個 GPURenderBundleEncoder,它可用於預先記錄命令束。這些命令束可以透過 GPURenderPassEncoderexecuteBundles() 方法,根據需要重複使用任意多次。

語法

js
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 示例中,許多相似的操作同時應用於許多不同的物件。命令束是使用以下函式進行編碼的:

js
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 中。

js
const renderBundleEncoder = device.createRenderBundleEncoder({
  colorFormats: [presentationFormat],
});
recordRenderPass(renderBundleEncoder);
const renderBundle = renderBundleEncoder.finish();

然後使用 GPURenderPassEncoder.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-gpudevice-createrenderbundleencoder

瀏覽器相容性

另見