GPURenderBundleEncoder: drawIndirect() 方法
drawIndirect()
是 GPURenderBundleEncoder
接口的方法,用于使用从 GPUBuffer
读取的参数绘制图元。
注意:此方法的功能与 GPURenderPassEncoder
上的等效方法(drawIndirect()
)相同。
语法
js
drawIndirect(indirectBuffer, indirectOffset)
参数
indirectBuffer
-
包含用于执行绘制操作的
vertexCount
、instanceCount
、firstVertex
和firstInstance
值的GPUBuffer
。该缓冲区必须包含一个紧密打包的四个 32 位无符号整数值块(总共 16 字节),其顺序与GPURenderBundleEncoder.draw()
参数的顺序相同。例如jsconst uint32 = new Uint32Array(4); uint32[0] = 3; // The vertexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstVertex value uint32[3] = 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);
// Create drawIndirect values
const uint32 = new Uint32Array(4);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 16,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
bundleEncoder.drawIndirect(drawValues, 0);
// End the bundle recording
const renderBundle = bundleEncoder.finish();
// ...
规范
规范 |
---|
WebGPU # dom-gpurendercommandsmixin-drawindirect |
浏览器兼容性
BCD 表格仅在浏览器中加载
另请参阅
- The WebGPU API