在同一子通道中同时使用图像作为输入附件和彩色输出附件是否合法?

时间:2019-08-24 02:14:32

标签: vulkan

我正在尝试以我不确定的方式来优化代码。 我正在尝试延迟渲染,因此我建立了带有两个子通道的渲染通道。 第一个输出反照率/正常/深度图像,第二个将它们用作输入附件以创建最终图像。 直到现在,我还使用一幅图像编写反照率,而另一张图像则使用G缓冲区输出最终的计算结果。

我想知道是否可以对反照率和最终计算使用相同的图像。 因此,我尝试只使用一个图像作为第一个子通道中的颜色输出附件,并作为第二个子通道中的颜色输出附件和输入附件。 鉴于输入附件可以是SHADER_READ_ONLY_OPTIMAL或GENERAL,因此我使用常规布局,因为我需要在图像中进行书写。

它几乎可以完美运行,但是首先,我不确定是否很幸运,其次,我从验证层获得了此消息:

  

“输入附件的布局一般,但应为READ_ONLY_OPTIMAL。

     

颜色附件的布局一般,但应为COLOR_ATTACHMENT_OPTIMAL。”

输入附件和颜色附件所引用的图像是我用于读取和写入的图像。 我不知道此消息是驱动程序错误还是只是告诉我我做错了什么。 而且,即使这是合法的举动,我认为使用GENERAL布局而不是COLOR_ATTACHMENT_OPTIMAL也会使性能比仅具有两个图像差。

1 个答案:

答案 0 :(得分:3)

标题中的问题的答案是肯定的,您可以在同一子通道中将附件同时用作输入附件和颜色附件。验证层不应输出警告。这并不违反验证规则(实际上, only 仅通用布局允许将附件用作输入和颜色)。验证层可以告诉您何时在子通道中为两个对象使用相同的附件,因此在这种情况下,不应为使用常规布局发出警告。

随时使用submit an issue to the validation layer project on GitHub

但是,这并不是完全您的正文要求的。这个问题的答案:

  

如果有可能将相同的图像用于反照率和最终计算

是“否”。

在延迟渲染器的光照过程中,通常需要多次覆盖相同的像素。您可能拥有比单次通过合理计算要多的光照,或者您可能需要做特殊的阴影或其他不易很好地结合的事物或其他事物。因此,您通常需要多次渲染屏幕的同一区域,并对每个具有输出颜色的渲染使用加法混合。

如果您要写入存储反照率的图像,则以后的读取(假设您进行了适当的障碍体操训练,允许从写入同一子通道中附件的值中读取数据)将读取光强度,而不是反照率值。因此,它将做错数学。

是的,您将需要另一个图像。