GPURenderBundleEncoder: drawIndexedIndirect() 方法
注意:此功能在 Web Workers 中可用。
drawIndexedIndirect() 方法属于 GPURenderBundleEncoder 接口,它使用从 GPUBuffer 读取的参数来绘制索引图元。
注意: 此方法在功能上与其在 GPURenderPassEncoder 上的等效方法 — drawIndexedIndirect() — 完全相同。
语法
js
drawIndexedIndirect(indirectBuffer, indirectOffset)
参数
indirectBuffer-
一个
GPUBuffer,其中包含执行绘制操作所需的indexCount、instanceCount、firstIndex、baseVertex和firstInstance值。该缓冲区必须包含一个紧密打包的五个 32 位无符号整数值块,表示这些值(总共 20 字节),顺序与GPURenderBundleEncoder.drawIndexed()的参数顺序相同。例如: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);注意: 必须启用
indirect-first-instance功能才能使用非零的firstInstance值。如果未启用indirect-first-instance功能且firstInstance不为零,则drawIndexedIndirect()调用将被视为无操作(no-op)。 indirectOffset-
indirectBuffer中数据开始的偏移量(以字节为单位)。
返回值
无 (Undefined)。
验证
调用 drawIndirect() 时必须满足以下条件,否则将生成 GPUValidationError 并且 GPURenderBundleEncoder 将失效
indirectBuffer的GPUBuffer.usage包含GPUBufferUsage.INDIRECT标志。indirectOffset+indirectBuffer中值参数指定的总大小小于或等于indirectBuffer的GPUBuffer.size。indirectOffset是 4 的倍数。
示例
js
// …
// Create GPURenderBundleEncoder
const bundleEncoder = device.createRenderBundleEncoder(descriptor);
// Set pipeline and vertex buffer
bundleEncoder.setPipeline(renderPipeline);
bundleEncoder.setVertexBuffer(0, vertexBuffer);
bundleEncoder.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
bundleEncoder.drawIndexedIndirect(drawValues, 0);
// End the bundle recording
const renderBundle = bundleEncoder.finish();
// …
规范
| 规范 |
|---|
| WebGPU # dom-gpurendercommandsmixin-drawindexedindirect |
浏览器兼容性
加载中…