4

抱歉,如果这是重复的,我似乎找不到可靠的答案。

如果我在多个程序中使用相同的顶点着色器,是否可以安全地假设 getUniformLocation 保持不变?

例如,如果我在多个程序(A、B、C、D)中使用以下顶点着色器:

uniform mat4    uMvp;
attribute vec3 aPosition;

void main() {
             vec4 position = vec4(aPosition.xyz, 1.);
             gl_Position = uMvp * position;
 }

在初始化时我要打电话

 GLUint mvpLoc = getUniformLocation("uMvp"); 

在使用程序 A 时,我可以安全地切换到程序 B/C/D 并继续使用 mvploc 吗?我对 GLES 2.0 相对较新,从表面上看,这似乎是一种不好的做法,但我认为调用 getUniformLocation 时会有开销,这是可以避免的。

我已经阅读了有关 glBindAttribLocation 的信息,因此我可以使用它,而是将 uMvp 作为属性,但后来我觉得我错过了一点,因为通常的做法似乎是将 mvps 作为统一变量。

4

1 回答 1

4

不,每个程序程序对象将具有单独的统一位置。无法保证两个不同的程序使用相同的位置来购买相同的制服。

除非您可以访问 ARB_explicit_uniform_locations 或 GL 4.3(您没有,因为您使用的是 ES)。这允许您在着色器中明确指定统一位置。

于 2013-05-13T11:27:27.877 回答