我试图了解 OpenGL 4.5 中的纹理、纹理单元和采样器。我附上一张我想弄清楚的图片。我认为在我的示例中一切都是正确的,但我不太确定右侧带有问号的 1D 采样器。
所以,我知道 OpenGL 提供了许多纹理单元/绑定点,可以在其中绑定纹理和采样器,以便它们协同工作。
这些绑定点中的每一个都可以支持每个纹理目标之一(在我的情况下,我正在绑定目标GL_TEXTURE_2D
and GL_TEXTURE_1D
到绑定点0
,还有另一个GL_TEXTURE_2D
到绑定点1
).
此外,采样器可以以大致相同的方式绑定到这些绑定点(我已将 2D 采样器绑定到绑定点)0
在图中)。
执行这些操作的函数是glBindTextureUnit
and glBindSampler
.
我最初的想法是将 1D 采样器也绑定到绑定点 0,并在着色器区域中根据绑定点和采样器类型进行匹配:
layout (binding = 0) uniform sampler1D tex1D;
layout (binding = 0) uniform sampler2D tex2D;
引用来源:
每个纹理图像单元支持绑定到所有目标。所以一个 2D
纹理和数组纹理可以绑定到同一个图像单元, 或者
不同的 2D 纹理可以绑定在两个不同的图像单元中
互不影响。那么什么时候使用哪个纹理
渲染?在 GLSL 中,这取决于使用它的采样器类型
纹理图像单元。
但我发现以下声明:
[..] 听起来很可疑,你可以使用相同的纹理图像单元
对于不同的采样器,只要它们具有不同的纹理类型即可。
不要这样做。规范明确不允许这样做;如果两个不同
GLSL 采样器具有不同的纹理类型,但与
相同的纹理图像单元,则渲染将失败。给每个
采样器不同的纹理图像单元。
所以,我的问题是,将不同的纹理目标绑定到同一个绑定点的目的是什么,如果最终是single采样器将被绑定到该绑定点,迫使您做出选择?
我引用的信息:https://www.khronos.org/opengl/wiki/Texture#Texture_image_units https://www.khronos.org/opengl/wiki/Texture#Texture_image_units