用途:解决“同一网格如何绘制多次”与“如何在 CPU 不知道数量的情况下发起绘制”两类问题,并组合成 GPU 驱动渲染。适用于 WebGPU 1.0-stable(Chrome 113+、Safari 26+、Firefox 141+)。
主要能力:直接实例化绘制 draw(vertexCount, instanceCount, firstVertex, firstInstance) 与 drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);间接绘制 drawIndirect(indirectBuffer, indirectOffset)、drawIndexedIndirect(indirectBuffer, indirectOffset) 与间接派发 dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset)。间接记录为紧凑小端 u32:drawIndirect 16 字节(vertexCount、instanceCount、firstVertex、firstInstance),drawIndexedIndirect 20 字节(indexCount、instanceCount、firstIndex、baseVertex、firstInstance),dispatchWorkgroupsIndirect 12 字节(workgroupCountX/Y/Z)。
使用方式:间接缓冲区 usage 必须含 GPUBufferUsage.INDIRECT,常用 COPY_DST | INDIRECT,GPU 写入时加 STORAGE;indirectOffset 必须是 4 的倍数;必须写满整条记录,未用字段显式写 0。每实例数据二选一:stepMode: "instance" 的顶点缓冲区,或用 @builtin(instance_index) 索引存储缓冲区。GPU 驱动渲染由计算通道写间接缓冲区,同一 queue.submit 的渲染通道读取,无需回读 CPU。
限制:间接绘制中非零 firstInstance 需要 indirect-first-instance 特性,缺失时该值被静默置 0;直接绘制无此限制。multiDrawIndexedIndirect 为实验性,仅 Chrome 131+ 且需特性检测,不可假定可用。禁止逐对象循环 draw、错误步长、未初始化记录、非 4 倍数偏移、对每实例数据用 stepMode: "vertex"。参考文件含 methods.md、examples.md、anti-patterns.md。