有没有办法解决Vulkan中的subpassInput问题?

问题描述:

SubpassInput由片段着色器隐式寻址。 我想用我自己的纹理Coords来解决输入问题。 与纹理相似(采样器,texCoord)有没有办法解决Vulkan中的subpassInput问题?

这是不可能的。如果你想品尝着色器内的图像,您有(一般)两种可能性:

  1. 您可以使用一个描述符类型采样图像组合图像采样的描述符中设置。这样你可以解决它,只要你喜欢。但是,在渲染过程中充当附件的图像不能用于同一渲染过程中的这些描述符,而在这些过程中它们被用作附件。为此,您需要结束渲染通道并启动另一个渲染通道。在第二次渲染过程中,您可以使用这些图像并从着色器中对其进行采样。

  2. 如果您想要在渲染过程中使用图像作为附件,并且您想要在同一渲染过程中(但在后续子过程中)对这样的图像进行采样,则只能使用输入附件描述符(着色器内的subpassInput)。这样您就不需要结束渲染过程并启动另一个过程,但是您只能对与片段着色器的坐标关联的位置进行采样。

    这个限制来自渲染高度平行的事实。下一个子通道的某些部分可能已经在来自前一个子通道的所有操作完成之前开始处理(考虑平铺渲染器)。如果您开始从前一个子通道中的图像中读取数据,并且该图像的某些部分尚未完成渲染,则可能会得到不正确的值。这就是为什么您只能从渲染过程中的单个位置读取(使用输入附件时)。

也许有一个扩展提升了这些约束,但我没有读到任何这样的扩展。核心规格只允许上述两个选项。

+0

我想将2个后期效果应用于我的输出。第一个后期效果与片段着色器中的渲染输出一起播放,其中第二后期效果翻转图像。通过第一个子通道,我可以实现第一个后期效果。对于第二个子通道是否有办法实现它?如果我无法解决纹理问题,可以修改我可以将颜色写入的位置? –

+1

@abhijitjagdale:不,你*必须*打破渲染过程。应该注意的是,当你在OpenGL ES中做了这样的诀窍时,你几乎杀死了你的表现。 Vulkan不会让你想到这是一个便宜的操作。 –

+0

我认为有一个扩展名允许您反转视口,从而反转显示的图像。但它只是一个扩展,所以它可能不支持所有设备。使用核心规格您需要启动新的渲染通道或使用计算着色器反转图像。 – Ekzuzy