因此,我正在为Vulkan应用程序开发GLSL计算着色器,该应用程序将对两个输入图像进行操作以创建输出图像。
目前为止,我的布局绑定是这样的:layout(binding = 0, rg32f) uniform readonly image2D input1;
layout(binding = 1, rg32f) uniform readonly image2D input2;
layout(binding = 2) uniform writeonly image2D outputImage;
我用格式限定符声明了这些,根据规范:
图像变量可以用格式限定符声明;这指定了在映像上执行的任何读操作的格式。因此,如果不使用仅写内存限定符声明变量,则需要使用格式限定符。
所以事情是,我现在想在第二个图像类型上使用相同的着色器:VK_FORMAT_R8G8B8A8_UNORM
除了VK_FORMAT_R32G32_SFLOAT
。
处理这种情况的最佳实践是什么?是否有可能以某种方式概括这个着色器,或者我是否需要为第二个输入格式编译第二个着色器?
我现在想在第二个图像类型上使用相同的着色器:
VK_FORMAT_R8G8B8A8_UNORM
除了VK_FORMAT_R32G32_SFLOAT
。
这是两个非常不同的操作,它们需要在GPU上执行非常不同的代码。这就是为什么格式是变量的一部分。
然而,如果你坚持要在单个着色器中这样做,你可以别名声明。也就是说,对两个不同的变量使用相同的描述符集+绑定,并基于专门化常量或统一访问正确的描述符集。