GPURenderPassEncoder: drawIndexedIndirect() Methode
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
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 drawIndexedIndirect()
-Methode der GPURenderPassEncoder
-Schnittstelle zeichnet indexierte Primitive unter Verwendung von Parametern, die aus einem GPUBuffer
gelesen werden.
Syntax
drawIndexedIndirect(indirectBuffer, indirectOffset)
Parameter
indirectBuffer
-
Ein
GPUBuffer
, der die WerteindexCount
,instanceCount
,firstIndex
,baseVertex
undfirstInstance
enthält, die für den Zeichenvorgang benötigt werden. Der Puffer muss einen eng gepackten Block von fünf 32-Bit-Unsigned-Integer-Werten enthalten (insgesamt 20 Bytes), die in der gleichen Reihenfolge wie die Argumente fürGPURenderPassEncoder.drawIndexed()
angegeben sind. Zum Beispiel:jsconst uint32 = new Uint32Array(5); uint32[0] = 3; // The indexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstIndex value uint32[3] = 0; // The baseVertex value uint32[4] = 0; // The firstInstance value // Write values into a GPUBuffer device.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);
Hinweis: Das
indirect-first-instance
Merkmal muss aktiviert sein, damit nicht-nullfirstInstance
-Werte verwendet werden können. Wenn dasindirect-first-instance
-Merkmal nicht aktiviert ist undfirstInstance
nicht null ist, wird derdrawIndexedIndirect()
-Aufruf als No-Op behandelt. indirectOffset
-
Der Offset in Bytes in
indirectBuffer
, an dem die Wertedaten beginnen.
Rückgabewert
Keiner (Undefined
).
Validierung
Die folgenden Kriterien müssen erfüllt sein, wenn drawIndirect()
aufgerufen wird, andernfalls wird ein GPUValidationError
erzeugt und der GPURenderPassEncoder
wird ungültig:
- Die
GPUBuffer.usage
vonindirectBuffer
enthält dasGPUBufferUsage.INDIRECT
-Flag. indirectOffset
plus die durch die Wertparameter imindirectBuffer
angegebene Gesamtgröße ist kleiner oder gleich derGPUBuffer.size
desindirectBuffer
.indirectOffset
ist ein Vielfaches von 4.
Beispiele
// …
// Create GPURenderPassEncoder
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
// Set pipeline and vertex buffer
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setIndexBuffer(indexBuffer, "uint16");
// Create drawIndexedIndirect values
const uint32 = new Uint32Array(5);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
uint32[4] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 20,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
passEncoder.drawIndexedIndirect(drawValues, 0);
// End the render pass
passEncoder.end();
// End frame by passing array of GPUCommandBuffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);
// …
Spezifikationen
Specification |
---|
WebGPU # dom-gpurendercommandsmixin-drawindexedindirect |
Browser-Kompatibilität
Siehe auch
- Die WebGPU API