正如 glsl 规范所说
gvec4 texture( gsampler2D sampler,
vec2 P,
[float bias]);
gvec4 texture( gsampler2DRect sampler,
vec2 P);
我在 vulkan 中测试了这两个条件。我绑定相同的图像数据并给出相同的坐标。结果是一样的。 那么它们之间有什么区别呢。我可以构造sampler2D和sampler2DRect有不同结果的条件吗?
2D 纹理和矩形纹理之间最重要的区别是 2D 纹理实际上可以在 Vulkan 中工作,而矩形纹理不能。
矩形纹理是 OpenGL 的一个古老遗迹,Vulkan 不使用它。对于 OpenGL,矩形纹理是一种特殊的纹理类型(与 2D 纹理不同),它只有一个 mipmap 并且其纹理坐标未标准化,但您仍然可以进行过滤。非标准化纹理坐标是矩形纹理的一个特殊特征。
在 Vulkan 和 SPIR-V 中,纹理坐标是否标准化是 sampler 的一部分,而不是纹理类型的一部分。因此,您可以通过在采样器中设置适当的参数并在 GLSL 着色器中使用
textureLod
(以及 sampler2D
作为采样器类型)来获得与矩形纹理相同的效果。您需要使用 textureLod
,因为 texture
依赖于隐式 LOD 计算,而 Vulkan 在非标准化坐标上不允许这样做。