GPUDevice: Methode createRenderBundleEncoder()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
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 createRenderBundleEncoder()
-Methode der GPUDevice
-Schnittstelle erstellt einen GPURenderBundleEncoder
, der verwendet werden kann, um Bündel von Befehlen vorab aufzuzeichnen. Diese können in GPURenderPassEncoder
s über die executeBundles()
-Methode beliebig oft wiederverwendet werden.
Syntax
createRenderBundleEncoder(descriptor)
Parameter
descriptor
-
Ein Objekt mit den folgenden Eigenschaften:
colorFormats
-
Ein Array von enumerierten Werten, die die erwarteten Farbformate für Render-Ziele angeben. Mögliche Werte finden Sie in der
GPUTextureFormat
-Definition in der Spezifikation. depthReadOnly
Optional-
Ein Boolean. Wenn
true
, bedeutet dies, dass das Ausführen eines vomGPURenderBundleEncoder
erstelltenGPURenderBundle
die Tiefenkomponente desdepthStencilFormat
bei der Ausführung nicht modifizieren wird. Wenn weggelassen, wirddepthReadOnly
standardmäßig auffalse
gesetzt. depthStencilFormat
Optional-
Ein enumerierter Wert, der das erwartete Format für Tiefe- oder Stencil-Ziele angibt. Mögliche Werte finden Sie im Abschnitt Depth-stencil formats der Spezifikation.
label
Optional-
Ein String, der eine Bezeichnung bereitstellt, die verwendet werden kann, um das Objekt zu identifizieren, z.B. in
GPUError
-Meldungen oder Konsolenwarnungen. sampleCount
Optional-
Eine Zahl, die die erwartete Anzahl von Samples für Render-Ziele darstellt.
stencilReadOnly
Optional-
Ein Boolean. Wenn
true
, bedeutet dies, dass das Ausführen eines vomGPURenderBundleEncoder
erstelltenGPURenderBundle
die Stencil-Komponente desdepthStencilFormat
bei der Ausführung nicht modifizieren wird. Wenn weggelassen, wirdstencilReadOnly
standardmäßig auffalse
gesetzt.
Rückgabewert
Eine GPURenderBundleEncoder
-Objektinstanz.
Beispiele
Im WebGPU-Samples Animometer-Beispiel werden zahlreiche ähnliche Operationen an vielen verschiedenen Objekten gleichzeitig durchgeführt. Ein Bündel von Befehlen wird mit der folgenden Funktion kodiert:
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);
}
}
Später wird ein GPURenderBundleEncoder
mit createRenderBundleEncoder()
erstellt, die Funktion wird aufgerufen, und das Befehlsbündel wird in einem GPURenderBundle
mit GPURenderBundleEncoder.finish()
aufgenommen:
const renderBundleEncoder = device.createRenderBundleEncoder({
colorFormats: [presentationFormat],
});
recordRenderPass(renderBundleEncoder);
const renderBundle = renderBundleEncoder.finish();
Anschließend wird GPURenderPassEncoder.executeBundles()
verwendet, um die Arbeit über mehrere Render-Durchläufe hinweg zu wiederholen und die Leistung zu verbessern. Studieren Sie das Beispiel zur vollständigen Kontextualisierung.
// ...
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
Specification |
---|
WebGPU # dom-gpudevice-createrenderbundleencoder |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- Die WebGPU API