GPURenderPassEncoder:drawIndexedIndirect() 方法
drawIndexedIndirect()
方法是 GPURenderPassEncoder
接口的方法,它使用从 GPUBuffer
读取的参数绘制索引图元。
语法
js
drawIndexedIndirect(indirectBuffer, indirectOffset)
参数
indirectBuffer
-
一个
GPUBuffer
,包含执行绘制操作所需的indexCount
、instanceCount
、firstIndex
、baseVertex
和firstInstance
值。该缓冲区必须包含一个紧密排列的五个 32 位无符号整数值块(总共 20 字节),顺序与GPURenderPassEncoder.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
对应的值必须为 0。如果未启用indirect-first-instance
功能且firstInstance
不为零,则drawIndexedIndirect()
调用将被视为无效操作。 indirectOffset
-
以字节为单位的偏移量,指示
indirectBuffer
中值数据开始的位置。
返回值
无(Undefined
)。
验证
调用 drawIndirect()
时必须满足以下条件,否则将生成 GPUValidationError
,并且 GPURenderPassEncoder
将变为无效
indirectBuffer
的GPUBuffer.usage
包含GPUBufferUsage.INDIRECT
标志。indirectOffset
加上indirectBuffer
中值参数指定的总大小小于或等于indirectBuffer
的GPUBuffer.size
。indirectOffset
是 4 的倍数。
示例
js
// ...
// 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()]);
// ...
规范
规范 |
---|
WebGPU # dom-gpurendercommandsmixin-drawindexedindirect |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。