Vulkan主命令缓冲区多次调用vkCmdBindPipeline是否属于错误用法?
问题解答
核心结论
在主命令缓冲区中多次调用vkCmdBindPipeline完全是合法的常规操作,不属于错误用法。
Vulkan的命令缓冲区遵循状态机设计,vkCmdBindPipeline的作用就是切换当前命令缓冲区的活跃渲染管线,后续所有绘制命令都会基于新绑定的管线执行,直到你再次调用该接口切换管线为止。你给出的代码示例是工业界非常普遍的实现逻辑:
vkBeginCommandBuffer(primaryCommandBuffer...); vkCmdBeginRenderPass(...); vkCmdBindPipeline(...pipeline_things_a); vkCmdBindDescriptorSets(...); vkCmdBindVertexBuffers(...); vkCmdBindIndexBuffer(...); vkCmdSetViewport(...); vkCmdSetScissor(...); draw_things_a(...) {... vkCmdDrawIndexed(...) ...} vkCmdBindPipeline(...pipeline_things_b); vkCmdBindDescriptorSets(...); vkCmdBindVertexBuffers(...); vkCmdBindIndexBuffer(...); vkCmdSetViewport(...); vkCmdSetScissor(...); draw_things_b(...) {... vkCmdDrawIndexed(...) ...} vkCmdEndRenderPass(primaryCommandBuffer); vkEndCommandBuffer(primaryCommandBuffer);
当场景中存在多个使用不同着色器、不同管线配置的物体时,在主命令缓冲区直接切换管线、绑定资源、执行绘制是完全合理的实现,不需要强制使用次级命令缓冲区完成管线切换。
补充说明
次级命令缓冲区的核心适用场景是多线程命令录制优化,或是对重复执行的绘制逻辑做封装复用,如果你没有这类需求,仅使用主命令缓冲区完成所有渲染逻辑完全可行,对于绝大多数中小规模场景不会有性能问题。
如果你要排查次级命令缓冲区相关的段错误,必须开启Vulkan验证层,验证层会直接输出明确的错误原因和位置,比如次级命令缓冲区继承信息配置错误、录制时状态不匹配、调用时主命令缓冲区状态不符合要求等问题,排查效率远高于手动盲查。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

