【问题标题】:Do uniform values remain in GLSL shader if unbound?如果未绑定,统一值是否保留在 GLSL 着色器中?
【发布时间】:2012-06-01 21:30:30
【问题描述】:

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

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

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    是的,制服是特定于某个程序的,如果您解除绑定并重新绑定,制服将保持不变。

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

    来自OpenGL 4.1 Specification

    2.11.7 统一变量

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

    【讨论】:

    • 你有这方面的官方消息吗?
    • 谢谢,我不知道glGetUniform,很有用。
    • 我想知道这是否也适用于属性。我的意思是如果你启用一些属性 glEnableVertexAttribArray 然后解除绑定/重新绑定着色器,顶点属性是否也会保留,我可以调用 draw 吗?
    • @PankajBansal 顶点属性由绑定的顶点数组对象跟踪,而不是着色器程序。着色器程序和 VAO 没有直接关系。您必须在渲染之前绑定正确的着色器程序和 VAO。有关 VAO 的介绍,请参阅:khronos.org/opengl/wiki/…
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多