鉴于我有两个不同的着色器,因此我有两个不同的
VkPipeline
。它们将共同渲染相同的颜色附件和深度附件。 (我使用动态渲染,所以这里没有渲染通道/子通道)。第二个管道可能依赖于第一个管道的输出。
我当前的
renderFrame
记录命令缓冲区如下:
vkCmdBeginRendering (with attachments load op = clear, store op = ?)
vkCmdBindPipeline - bind the first pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering
vkCmdBeginRendering (with same attachments, load op = ?, store op = store/don't care)
vkCmdBindPipeline - bind the second pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering
这是我的问题:
storeOp
我应该使用什么 vkCmdBeginRendering
,第二个 loadOp
我应该使用什么 vkCmdBeginRendering
?到现在为止我
storeOp
= VK_ATTACHMENT_STORE_OP_STORE
,深度附件 storeOp
= VK_ATTACHMENT_STORE_OP_DONT_CARE
第一个 vkCmdBeginRendering
loadOp
=VK_ATTACHMENT_LOAD_OP_LOAD
,深度附件loadOp
=VK_ATTACHMENT_LOAD_OP_DONT_CARE
第二个vkCmdBeginRendering
这适用于我的平台(Windows 10/Linux + AMD GPU),验证层不会抱怨任何事情。但我想在这里安全,所以发布这个问题。
我原来的项目有点大,技术堆栈有点奇怪,所以我不会在这里发布真正的代码。
编辑1:我发现我实际上并不需要多个
vkCmdBeginRendering
来使用多个管道:
vkCmdBeginRendering
vkCmdBindPipeline - bind the first pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdBindPipeline - bind the second pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering
多个
vkCmdDraw
系列命令之间的“同步”问题已经在这里和这里进行了详细阐述。无需同步。
但是我仍然想知道原始问题的答案,因为管道可以写入多个附件,并且两个管道可能只共享一些输出附件(尽管我还没有实际的示例)。
两个管道之间是否需要某种同步/屏障?
作为一般经验法则,即使使用动态渲染,您也需要自己管理同步。当 2 个渲染通道(动态或正常)写入同一附件时,或者一个写入一个读取同一附件时,您需要管道和内存屏障来同步使用。 2 个同时读取不需要此操作。在编辑中,您在第一遍结束时删除了 vkCmdEndRendering 和 vkCmdBeginRendering,因此您不再需要同步。但是,这意味着您无法从第二个管道读取第一个管道的结果。因为他们现在是同一个通行证。
第一个 vkCmdBeginRendering 我应该使用什么 storeOp,以及什么 我应该将 loadOp 用于第二个 vkCmdBeginRendering
您提到您的第二遍可能依赖于第一个管道的输出。因此,您可以在第一遍中使用 storeOp Store,并在第二遍中使用 loadOp 加载。
我希望这对你有帮助!