我正在编写一个批处理系统来跟踪当前绑定的纹理,以避免不必要的glBindTexture()
调用。我不确定是否需要跟踪特定批次已经使用了哪些纹理,以便如果纹理被使用两次,它将绑定到需要它的第二个采样器的不同 TIU。
OpenGL 应用程序可以为同一着色器阶段内的多个采样器使用相同的纹理图像单元吗?不同着色器阶段的采样器呢?例如:
片段着色器:
...
uniform sampler2D samp1;
uniform sampler2D samp2;
void main() { ... }
主程序:
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...
我看不出这不应该起作用的任何原因,但是如果着色器程序还包括这样的顶点着色器呢:
顶点着色器:
...
uniform sampler2D samp1;
void main() { ... }
在这种情况下,OpenGL 应该将 的两个实例samp1
视为引用相同的位置。因此,在顶点着色器和片段着色器中使用了相同的纹理单元。我已经读过在两个不同的着色器阶段使用相同的纹理是双重的,GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
但这似乎与此相矛盾。
在对我的硬件(HD 6870)进行的快速测试中,以下所有场景都按预期工作:
- 1 TIU 用于同一着色器阶段中的 2 个采样器制服
- 1 个 TIU 用于 1 个采样器制服,用于 2 个着色器阶段
- 1 TIU 用于 2 件采样器制服,每件都发生在不同的阶段。
但是,我不知道这是否是我应该在所有硬件/驱动程序上预期的行为,或者是否存在性能影响。