我正在练习vulkan API,昨天我几乎浪费了一整天的时间来实现二级缓冲区,以便在不同的对象上使用不同的片段着色器。大问题是在调用vkCmdDrawIndexed()时出现错误“分段错误”。就目前而言,这对我来说是一个马特黑盒,我没有找到一种方法来调查问题的根源。尽管vulkan API有用于调试的验证层,但如果没有这些验证层,事情就会变得很复杂。我怀疑这个错误存在于创建第二个CommandBuffers的代码中。
由于我不知道而忽略了这些问题,我意外地发现代码在只有主命令缓冲区和多次调用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);我在常规的学习路径之外,所以我的问题在大多数情况下可能是一个明显的错误,但我会问:
在主命令缓冲区中多次调用vkCmdBindPipeline()是错误的吗?
发布于 2021-11-12 17:46:59
不,这不是一个错误。你可以任意调用,比如在一个命令缓冲区中绑定管道。通常,您可以在单个命令缓冲区中任意调用以vkCmd开头的所有命令。
https://stackoverflow.com/questions/69942444
复制相似问题