【发布时间】:2013-10-20 02:11:26
【问题描述】:
我正在编写一个批处理系统来跟踪当前绑定的纹理,以避免不必要的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 件采样制服,每件制服都出现在不同的阶段。
但是,我不知道这是否是我对所有硬件/驱动程序的预期行为,或者是否会影响性能。
【问题讨论】:
-
顺便问一下,您如何确定使用的纹理图像单元的数量?作为实现要求,您基本上每个阶段获得 16 个纹理图像单元,并且您可以在 GL3.2+(有 3 个阶段)中绑定多达 16*3 = 48 个独特的纹理。 GL4.x 有 5 个阶段,因此最多放弃 16*5 = 80。您应该将每个阶段使用的 TIU 数相加以获得准确的总数。