问题描述
在 Vulkan 中,假设我有两个渲染通道:
渲染通道按该顺序提交。
同步这两个渲染通道的正确方法是什么,以便第二个在第一个写入之前不会读取?
在它们之间的图像上创建图像管道屏障是必要和/或足够的吗?
解决方法
在它们之间有一个图像内存屏障是必要且充分的:
执行障碍:您需要确保第二个渲染通道片段着色器 (
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
) 在所有第一个渲染通道颜色附件写入 (VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
) 完成之前不会开始执行。>-
内存屏障:您需要确保第一个渲染通道颜色附件写入 (
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
) 对第二个渲染通道图像采样可用并且可见说明 (VK_ACCESS_SHADER_READ_BIT
) . -
布局过渡:您需要将图像的布局从
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
更改为VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
。
所有这些都可以在一个 vkCmdPipelineBarrier
中用一个 VkImageMemoryBarrier
完成。或者您可以在两个渲染通道之一(VkSubpassDependency
或 dstSubpass
设置为 srcSubpass
)以及附件的 VK_SUBPASS_EXTERNAL
和 {{1} } 字段。