如果未绑定,是否在GLSL着色器中保留统一值?

时间:2012-06-01 21:30:31

标签: c++ opengl glsl

我正在制作一个程序,它为不同的不同基元使用两个不同的着色器。我的问题是,如果我绑定一个程序,发送它统一变量,然后使用另一个着色器程序并回到第一个,传递的统一值是否仍然存在?这是一些伪代码:

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();
    }
}

1 个答案:

答案 0 :(得分:27)

是的,制服是特定于程序的,如果您解除绑定并重新绑定,它将是持久的。

此外,如果您愿意,可以使用glGetUniform轻松验证该样本。

来自OpenGL 4.1 Specification

  

2.11.7统一变量

  ......制服是程序对象特定的状态。它们在加载后保留其值,只要程序对象未重新链接,只要程序对象被使用,它们的值就会恢复。 ...