Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

GPUDevice: Methode createRenderBundleEncoder()

Eingeschränkt verfügbar

Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.

Want more browser support for this feature? Tell us why.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die Methode createRenderBundleEncoder() des Interfaces GPUDevice erstellt einen GPURenderBundleEncoder, mit dem Befehlsbündel vorab aufgezeichnet werden können. Diese lassen sich über die Methode executeBundles() beliebig oft in GPURenderPassEncoder-Instanzen wiederverwenden.

Syntax

js
createRenderBundleEncoder(descriptor)

Parameter

descriptor

Ein Objekt mit den folgenden Eigenschaften:

colorFormats

Ein Array von Enum-Werten, das die erwarteten Farbformate für Renderziele angibt. Mögliche Werte finden Sie in der Definition von GPUTextureFormat in der Spezifikation.

depthReadOnly Optional

Ein boolescher Wert. Wenn true, wird die Tiefenkomponente von depthStencilFormat bei der Ausführung eines vom GPURenderBundleEncoder erstellten GPURenderBundle nicht verändert. Wird depthReadOnly weggelassen, ist der Standardwert false.

depthStencilFormat Optional

Ein Enum-Wert, der das erwartete Tiefen- oder Stencil-Format für Renderziele angibt. Mögliche Werte finden Sie im Abschnitt Tiefen-Stencil-Formate der Spezifikation.

label Optional

Ein String mit einer Bezeichnung, anhand derer das Objekt beispielsweise in GPUError-Meldungen oder Konsolenwarnungen identifiziert werden kann.

sampleCount Optional

Eine Zahl, die die erwartete Anzahl von Samples für Renderziele angibt.

stencilReadOnly Optional

Ein boolescher Wert. Wenn true, wird die Stencil-Komponente von depthStencilFormat bei der Ausführung eines vom GPURenderBundleEncoder erstellten GPURenderBundle nicht verändert. Wird stencilReadOnly weggelassen, ist der Standardwert false.

Rückgabewert

Eine Instanz des Objekts GPURenderBundleEncoder.

Beispiele

Im Animometer-Beispiel der WebGPU Samples werden zahlreiche ähnliche Operationen gleichzeitig an vielen verschiedenen Objekten ausgeführt. Mit der folgenden Funktion wird ein Befehlsbündel kodiert:

js
// passEncoder is a GPURenderBundleEncoder or a GPURenderPassEncoder
function recordRenderPass(passEncoder) {
  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);
  }
}

Später wird mit createRenderBundleEncoder() ein GPURenderBundleEncoder erstellt, die Funktion aufgerufen und das Befehlsbündel mit GPURenderBundleEncoder.finish() in einem GPURenderBundle aufgezeichnet:

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

Anschließend wird GPURenderPassEncoder.executeBundles() verwendet, um die aufgezeichneten Befehle über mehrere Renderdurchläufe hinweg wiederzuverwenden und so die Leistung zu verbessern. Den vollständigen Zusammenhang entnehmen Sie dem Beispielcode.

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()]);
};

// …

Spezifikationen

Spezifikation
WebGPU
# dom-gpudevice-createrenderbundleencoder

Browser-Kompatibilität

Siehe auch