Graphics Vulkan API中渲染过程内的图像布局转换

Graphics Vulkan API中渲染过程内的图像布局转换,graphics,vulkan,Graphics,Vulkan,我使用Vulkan制作了一个渲染过程,它包含多个子过程。我们可以假设它有两个子类,子类A和B。在子类A中,我渲染到一个我想在子类B中用作组合图像采样器(即,不作为输入附件)的图像。我的问题是如何将图像从VK_图像_布局_颜色_附件转换到VK_图像_布局_着色器_只读_最优 我认为子类依赖机制本身并不好,因为我不使用子类B中的图像作为附件(我想使用它作为输入、颜色或保留附件都没有意义。)我想使用一个简单的具有自依赖性的图像屏障,当验证层告诉我如果在渲染过程中使用图像屏障,新布局字段和旧布局字段应该

我使用Vulkan制作了一个渲染过程,它包含多个子过程。我们可以假设它有两个子类,子类A和B。在子类A中,我渲染到一个我想在子类B中用作组合图像采样器(即,不作为输入附件)的图像。我的问题是如何将图像从VK_图像_布局_颜色_附件转换到VK_图像_布局_着色器_只读_最优

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


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

当您创建渲染过程和子过程时,必须使用以下结构:

typedef struct VkAttachmentReference {
    uint32_t         attachment;
    VkImageLayout    layout;
} VkAttachmentReference;
全局而言,此结构表示在子类的开头,图像将位于指定的布局中

因此,假设您想在子类0中使用布局颜色附件,并在子类1中输入附件(首选它而不是着色器读取),您只需为每个子类描述指定布局,并且必须在子类0和子类1之间声明一个子类依赖项。

渲染过程(和子类)设计用于子类a写入与子类B稍后读取相同的
(x,y,层)
像素的情况。它不用于从图像中随机访问

正如您所注意到的,所有类型的附件都只能通过这种方式访问图像。 然后是
pPreserveAttachments
。如果你把你的图片放在那里,你是不允许触摸的;如果不这样做,则图像将变得未定义。最好将附件视为不存储在任何地方的东西(即,仅存在于高速缓存中)。您必须将附件复制/存储到非附件映像,以使其可用

引用Vulkan规范:

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

而你的图像是一个附件。您正在子过程A(,所以它必须是)中将其用作颜色附件


这就是说,您可能需要两个单独的渲染过程(或者像@AntoineMorrier建议的那样,如果可能的话,为您的问题使用输入附件功能)。特别是如果您的其他图像没有上述可优化依赖项。

谢谢。正如我所说的,我不能用输入附件解决这个问题(尽管它们非常有用,我在渲染器中经常使用它们),所以我会重新设计我的过程。如果我们想从同一渲染过程的前一个子过程中的颜色/深度附件的图像中读取,我们只能通过输入附件来完成。因此,这并不是说我们更喜欢输入\附件布局而不是其他布局。我们必须使用它。但除此之外,我同意。