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

Seb*_*dez 22 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 28

是的,制服是特定于程序的,如果你取消绑定并重新绑定,它将是持久的.

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

OpenGL 4.1规范:

2.11.7统一变量

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