1

我找不到任何明确说明这一点的地方,但我可以这样做:

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,还是可以一次找到它的位置并确保它始终相同?

4

2 回答 2

2

只要您了解两件事,您就可以开始了:

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

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

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

    • 令我困扰的是,您在此范围内浮动的统一位置命名不佳......在此示例中,哪个统一属于哪个程序是不必要的难以理解。
于 2013-09-12T23:46:49.850 回答
0

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

于 2013-09-12T23:31:54.177 回答