Vulkan API中的渲染过程中的图像布局过渡

时间:2017-10-19 18:36:40

标签: graphics vulkan

我使用包含多个子通道的Vulkan进行了渲染过程。我们可以假设它有2个子通道,子通道A和B.在子通道A中,我渲染到我想在子通道B中用作组合图像采样器的图像(即,不作为输入附件)。我的问题是我应该如何从VK_IMAGE_LAYOUT_COLOR_ATTACHMENT到VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL进行图像转换?

我认为子通道依赖机制本身并不好,因为我没有使用子通道B中的图像作为附件(我想将它用作输入,颜色或保留附件是没有意义的。)我想使用一个具有自依赖性的简单图像障碍,当验证层告诉我如果在渲染过程中使用图像障碍时,我很惊讶,新旧布局字段应该相等!

这种图像布局过渡模式对我来说似乎很自然,但我还没有找到任何解决方案。也许我误解了子通道和渲染通道的概念,我应该为A和B使用不同的渲染通道? (虽然在这种情况下我必须在两个渲染过程中处理我的G缓冲区,我将无法使用Vulkan的“输入附件机制”。)

2 个答案:

答案 0 :(得分:3)

渲染通道(和子通道)设计用于子通道A写入与子通道B稍后读取的相同(x, y, layer)像素的情况。它不适用于图像的随机访问。

正如您所注意到的,所有类型的附件只能以这种方式访问​​图像。 然后是pPreserveAttachments。如果您确实在那里包含了图像,则不允许触摸它;如果不这样做,那么图像将变为未定义。将附件视为未存储在任何地方的东西(即仅存在于高速缓冲存储器中)可能更好。您必须将附件复制/存储到非附件图像,以使其可以这种方式使用。

引用Vulkan规范:

  

在渲染过程实例的持续时间内,不能以任何其他方式访问用作附件的图像子资源

并且您的图片 是附件。您在子通道A中使用它作为颜色附件(必须如此)。

话虽这么说,你可能需要两个单独的渲染通道(或者如果可能的话,使用输入附件功能来解决你的问题,正如@AntoineMorrier建议的那样)。特别是如果没有其他图像具有如上所述的可优化依赖性。

答案 1 :(得分:-1)

创建renderpass和子通道时,必须使用以下结构:

typedef struct VkAttachmentReference {
    uint32_t         attachment;
    VkImageLayout    layout;
} VkAttachmentReference;

在全球范围内,此结构表示在子通道开始时,您的图像将处于指定的布局中。

因此,假设您要在子通道0中使用布局COLOR_ATTACHMENT和子通道1中的INPUT_ATTACHMENT(比SHADER_READ更喜欢),您只需要为每个子通道描述指定布局,并且必须在两个子通道之间声明一个子通道依赖关系子通道0和子通道1。