opengl-es - 在不同的程序中使用相同的顶点着色器时,统一位置是否保持不变

标签 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 作为统一变量。

最佳答案

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

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

关于opengl-es - 在不同的程序中使用相同的顶点着色器时,统一位置是否保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16520913/

相关文章:

c++ - 我如何创建这种背景效果?

c# - 在离屏位图上应用像素着色器

opengl-es - 如何消除 mipmap 中的纹理接缝

java - 在 Android 中创建数字计数器的方法是什么?

ios - OpenGL ES 像素艺术 - 缩放

opengl - 为什么模型 View 矩阵?

java - 为什么是 glTranslatef?

opengl-es - OpenGL ES (2.0) 着色语言 : How to input boolean into vertex shader and pass to fragment shader?

opengl-es - 遵循 Nvidia GPU Gems 第 1 章设置 GLSL 海洋水着色器

c++ - 带图像存储的 bindTextureUnit