有没有办法解决 Vulkan 中的 subpassInput?
Is there a way to address subpassInput in Vulkan?
SubpassInput 由片段着色器隐式寻址。
我想用我自己的纹理坐标来处理输入。
类似于 texture(sampler, texCoord)
这是不可能的。如果您想在着色器内对图像进行采样,您有(通常)两种可能性:
您可以使用具有 采样图像 或 组合图像采样器 类型描述符的描述符集。这样你就可以随心所欲地解决它。但是在渲染过程中充当附件的图像不能用于在它们用作附件的同一渲染过程中的此类描述符。为此,您需要结束一个渲染过程并开始另一个渲染过程。在第二个渲染过程中,您可以使用此类图像并从着色器中对其进行采样。
如果你想在渲染过程中使用图像作为附件,并且如果你想在同一个渲染过程中(但在以后的子过程中)对这样的图像进行采样,你只能这样做它使用输入附件描述符(着色器中的 subpassInput)。这样您就不需要结束渲染通道并开始另一个渲染通道,但您只能对与片段着色器坐标相关联的位置进行采样。
这个限制来自于渲染是高度并行的。在上一个子通道的所有操作完成之前,下一个子通道的某些部分可能已经开始处理(考虑平铺渲染器)。如果您开始从您在之前的子通道中渲染到的图像读取数据,并且如果图像的某些部分尚未完成此渲染,则您可能会得到不正确的值。这就是为什么您只能从渲染过程中的单个位置读取(使用输入附件时)。
也许有一个扩展可以解除这些限制,但我没有读到任何此类扩展。核心规范只允许以上两个选项。
SubpassInput 由片段着色器隐式寻址。 我想用我自己的纹理坐标来处理输入。 类似于 texture(sampler, texCoord)
这是不可能的。如果您想在着色器内对图像进行采样,您有(通常)两种可能性:
您可以使用具有 采样图像 或 组合图像采样器 类型描述符的描述符集。这样你就可以随心所欲地解决它。但是在渲染过程中充当附件的图像不能用于在它们用作附件的同一渲染过程中的此类描述符。为此,您需要结束一个渲染过程并开始另一个渲染过程。在第二个渲染过程中,您可以使用此类图像并从着色器中对其进行采样。
如果你想在渲染过程中使用图像作为附件,并且如果你想在同一个渲染过程中(但在以后的子过程中)对这样的图像进行采样,你只能这样做它使用输入附件描述符(着色器中的 subpassInput)。这样您就不需要结束渲染通道并开始另一个渲染通道,但您只能对与片段着色器坐标相关联的位置进行采样。
这个限制来自于渲染是高度并行的。在上一个子通道的所有操作完成之前,下一个子通道的某些部分可能已经开始处理(考虑平铺渲染器)。如果您开始从您在之前的子通道中渲染到的图像读取数据,并且如果图像的某些部分尚未完成此渲染,则您可能会得到不正确的值。这就是为什么您只能从渲染过程中的单个位置读取(使用输入附件时)。
也许有一个扩展可以解除这些限制,但我没有读到任何此类扩展。核心规范只允许以上两个选项。