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

Is it legal to use an image both as an input attachment and a color output attachment in the same subpass?

我正在尝试优化我的代码,但我对此并不自信。 我正在试验延迟渲染,所以我构建了一个包含两个子通道的渲染通道。 第一个输出 albedo/normal/depth 图像,第二个使用它们作为输入附件来创建最终图像。 直到现在,我一直在使用一张图像来编写反照率,另一张图像使用 G 缓冲区输出最终计算结果。

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

它几乎完美地工作,但首先,我不确定自己是否走运,其次,我从验证层收到了这条消息:

"Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.

Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL."

其中输入附件和颜色附件引用的图像是我用于读取和写入的图像。 我不知道这条消息是驱动程序错误还是只是告诉我我做错了的一种方式。 此外,即使这是合法的举动,我认为使用 GENERAL 布局而不是 COLOR_ATTACHMENT_OPTIMAL 可能会使性能比简单地使用两个图像更差。

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

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

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

if it was possible to use the same image for the albedo and the final calculations

是"no".

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

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

是的,您需要另一张图片。