You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:17:09