27

我正在编写一个程序,该程序对不同的基元使用两种不同的着色器。我的问题是:如果我绑定一个程序,向它发送统一变量,然后使用另一个着色器程序并返回第一个,传递的统一值会保留吗?这是一些伪代码:

glUseProgram(shader1);
glUniform(shader1,...);
//stuff

for(elements in a list) {
    if(element.type = 1) {
        glUseProgram(shader2);
        element.draw();
    } else {
        glUseProgram(shader1); //Here, do the uniforms from above remain, if shader2 was bound before?
        element.draw();
    }
}
4

1 回答 1

34

是的,制服是特定于某个程序的,并且如果您取消绑定并重新绑定它,它将会保持不变。

此外,如果您愿意,您可以使用glGetUniform在该示例中轻松验证这一点。

来自OpenGL 4.1 规范

2.11.7 统一变量

...制服是程序对象特定的状态。一旦加载,它们就会保留它们的值,并且只要程序对象没有被重新链接,它们的值就会在使用程序对象时恢复。...

于 2012-06-01T21:33:00.570 回答