在 Vulkan 中,假设我有两个渲染通道:
- 第一个输出到图像作为其颜色附件。
- 第二个样本来自同一图像的片段着色器(即通过组合图像采样器)。
渲染通道按该顺序提交。
同步这两个渲染通道的正确方法是什么,以便第二个在第一个写入之前不读取?
在它们之间的图像上创建图像管道屏障是否有必要和/或足够?
在 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
)和附件的oldLayout
和newLayout
字段中使用 a。