能否为vkCmdDrawMultiEXT的每个绘制调用提供Push Constants?
结论:这个方案不可行
原因分析
Push Constants 在 Vulkan 里是命令缓冲区的当前状态,每次调用 vkCmdPushConstants 都会直接覆盖之前推送的值,而非累积存储多个副本。当你执行 vkCmdDrawMultiEXT(drawCount = 4) 时,所有4次绘制调用都会共享最后一次推送的 modelMatrix4,前面推送的3个矩阵早就被覆盖掉了,根本不会对应到各自的绘制实例。
vkCmdDrawMultiEXT 的设计是批量提交多个绘制命令,但这些命令会共享调用时的所有管线状态(包括 Push Constants、Descriptor Set 绑定、管线对象等),没有机制让它回溯并使用之前多次推送的 Push Constants 值。
可行的替代方案
- 实例化绘制+顶点属性:把模型矩阵作为实例属性,使用
vkCmdDrawInstanced或vkCmdDrawIndexedInstanced,让每个实例对应一个模型矩阵。这种方式适合实例数量较多的场景。 - Buffer存储+实例索引:将所有模型矩阵存入一个 Uniform Buffer 或 Storage Buffer,在顶点着色器中通过实例索引去读取对应的矩阵。需要注意 Buffer 的对齐要求和内存访问效率。
- 拆分绘制调用:如果一定要用 Push Constants,只能放弃
vkCmdDrawMultiEXT,改成每次推送一个矩阵后调用一次vkCmdDraw(或 Indexed 版本)。但这样会失去批量提交的性能优势,只适合绘制数量较少的场景。
你的代码实际效果示例
你给出的代码执行后,4次绘制都会使用 modelMatrix4,而非各自对应 modelMatrix1 到 modelMatrix4,这和你的预期完全不符。
内容的提问来源于stack exchange,提问作者matrixMule
相关产品推荐
相关产品推荐

