WebGPU中Indirect Draw的实现
-
Vulkan 提供了一个API IndirectDraw,根据官方github描述,是使用存储绘制命令的设备本地缓冲区,用来进行实例渲染,针对存储在同一个缓冲区中的不同meshes。
间接绘图卸载绘图命令生成,并提供在 GPU 上更新它们的能力,无需 CPU 再次接触缓冲区,也减少了绘制调用的数量。
WebGPU是否也提供了相应的API,是否实现了multi indirect draw的功能?
-
WebGPU有indirectDraw API
spec: https://www.orillusion.com/zh/webgpu.html#dom-gpurenderencoderbase-drawindirect但是目前的WebGPU indirectDraw 只能encode draw command,因为WebGPU buffer中的每一个trunk都只是包含了draw command,而在Vulkan 和 Dx12,在draw command 之后还可以添加bind group等等,这样不仅仅是对draw command进行indirect操作,还可以操控bind group等等。
就目前的WebGPU标准实现而言,indirectdraw 的意义不是很大,对性能提升不明显,仅仅只是加速draw的缓存而已,不如用 RenderBundle 提前对所有 command list 进行 record 从而提高性能。
另外目前webgpu还不支持多线程操作,标准计划会支持,但目前的版本还没有实现,所以multi draw/writebuffer/submit encoder/... 都还不支持