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

30

我正在编写一个使用两个不同着色器的程序。我的问题是:如果我绑定了一个程序,发送uniform变量,然后使用另一个着色器程序并返回到第一个程序,传递的uniform值是否会保留?以下是一些伪代码:

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个回答

38

是的,uniform变量是针对程序特定的,并且如果您解除绑定并重新绑定它,它将是持久的。

此外,如果您想要的话,您可以轻松地通过glGetUniform在该样例中验证这一点。

根据OpenGL 4.1规范:

2.11.7 统一变量

... Uniform变量是程序对象特定状态。 它们加载后保留其值,并且只要程序对象未被重新链接,它们的值就会在每次使用程序对象时恢复...


你是否有官方来源证实这个? - Pubby
谢谢你,我不知道glGetUniform,非常有用。 - Sebastian Mendez
1
我想知道这是否也适用于属性。我的意思是,如果您启用了某些属性glEnableVertexAttribArray,然后取消绑定/重新绑定着色器,那么顶点属性是否仍然存在,我可以直接调用绘制函数? - Pankaj Bansal
@PankajBansal 顶点属性由绑定的顶点数组对象跟踪,而不是着色器程序。 着色器程序和VAO之间没有直接关系。 在渲染之前,必须绑定正确的着色器程序和VAO。 有关VAO的介绍,请参见:https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object - holocronweaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接