在不同程序中使用相同的顶点着色器时,统一位置是否仍然存在

时间:2013-05-13 11:25:35

标签: opengl-es glsl shader

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

如果我在多个程序中使用相同的顶点着色器,可以安全地假设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作为统一变量。

1 个答案:

答案 0 :(得分:3)

不,每个程序程序对象都有单独的统一位置。没有办法保证两个不同的程序对相同的制服使用相同的位置。

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