OpenGL:是glUniformLocation常量吗?

时间:2013-09-12 23:27:27

标签: opengl

我无法找到任何明确说明的内容,但我可以这样做:

unsigned int someUniform = 0;
unsigned int anotherUniform = 0;

glUseProgram(1);
someUniform = glGetUniformLocation(1, "uniformLocation");
glUniform3f(someUniform, 1, 1, 1);

glUseProgram(2);
anotherUniform = glGetUniformLocation(2, "anotherUniform");
glUniform3f(anotherUniform, 1, 1, 1);

在下一帧中,我只是打电话:

glUseProgram(1);
glUniform3f(someUniform, 1, 1, 1);

glUseProgram(2);
glUniform3f(anotherUniform, 1, 1, 1);

我测试了一下它确实保持不变,但我只有两个程序,我认为我称之为复杂。

我是否需要每帧都获得uniformLocation,或者我可以找到它的位置一次并确保它始终相同?

2 个答案:

答案 0 :(得分:2)

只要你理解了两件事你就应该好好:

  1. 在连接着色器后建立统一位置

    • 它们仅分配给代码中实际引用的制服,除非您更改链接,否则不会更改。

  2. 统一位置是每个程序状态

    • 令我感到困扰的是,你在这个范围内漂浮的名称很差的统一位置......在这个例子中,哪个统一属于哪个程序是不必要的。

答案 1 :(得分:0)

如果你不重新编译着色器/重新链接程序,制服将保持不变。