采样器制服和纹理单元之间的对应关系glActiveTexture
显然无法使用 opengl 进行查询,并且我找不到关于如何查找哪个纹理单元映射到哪个采样器制服的良好文档。这是我能找到的:
- 如果程序中只有采样器制服,那么它会映射到
gl_TEXTURE0
- 如果单个程序阶段中有多个采样器制服,则它们将按照它们在着色器中声明的顺序进行映射。
- 如果顶点着色器和片段着色器具有不相交的采样器制服集,则顶点着色器中的采样器首先出现,然后是片段着色器中的采样器。
- 此行为似乎是由规范定义的。
例如,如果顶点着色器定义:
uniform sampler2D color;
片段着色器定义:
uniform sampler2D tex;
uniform sampler2D norm;
Then color
被映射到gl_TEXTURE0
, tex
被映射到gl_TEXTURE1
, and norm
被映射到gl_TEXTURE2
。但如果顶点着色器定义:
uniform sampler2D norm;
那么不同的纹理是如何映射的就不清楚了。由于可能存在布局限定符或单独的着色器阶段,这变得更加复杂。
我似乎在任何地方都找不到这方面的文档。我所知道的关于它的一切要么来自我自己的实验,要么来自 Stackoverflow 或 OpenGL 论坛上的答案。有谁知道在所有可能的情况下如何工作的一套全面的规则,或者查询采样器对应的纹理单元的方法?
这是我能找到的:
- 如果程序中只有采样器制服,那么它会映射到
gl_TEXTURE0
- 如果单个程序阶段中有多个采样器制服,则它们将按照它们在着色器中声明的顺序进行映射。
- 如果顶点着色器和片段着色器具有不相交的采样器制服集,则顶点着色器中的采样器首先出现,然后是片段着色器中的采样器。
- 此行为似乎是由规范定义的。
这些都不是真的。好吧,第一个是正确的,但只是偶然的。
所有未在着色器中初始化的统一值都被初始化为值 0。规范对此非常明确:
任何没有绑定限定符声明的统一采样器或图像变量最初都绑定到单元零。
采样器制服的值是它所代表的纹理单元的整数索引。所以 0 值对应于GL_TEXTURE0
。所有未初始化的采样器制服的值应为 0。
如果您描述的行为正在发生,那么该实现就在违反OpenGL 规范。
除非你使用layout(binding = )
语法来分配制服的纹理单元,你必须manually在 OpenGL 代码中,为每个采样器统一分配其纹理单元的值。这是通过设置其统一值来完成的,就像任何其他整数统一一样:您调用glUniform1i
与该制服对应的位置。因此,如果你想将它与纹理图像单元索引 4 关联起来,你可以调用glUniform1i(..., 4)
, where ...
是该制服的统一位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)