GPURenderBundleEncoder:drawIndexedIndirect() 方法
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);
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 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。