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

Posted

技术标签:

【中文标题】如果未绑定,统一值是不是保留在 GLSL 着色器中?【英文标题】: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();
    

【问题讨论】:

【参考方案1】:

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

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

来自OpenGL 4.1 Specification:

2.11.7 统一变量

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

【讨论】:

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

以上是关于如果未绑定,统一值是不是保留在 GLSL 着色器中?的主要内容,如果未能解决你的问题,请参考以下文章

在 GLSL 着色器中访问 VBO/VAO 数据

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

为啥我的着色器中的 GLSL 纹理坐标不是线性的?

GLSL:采样器上传仅在删除未使用的采样器时有效

GLSL:使用片段着色器进行对象翻译

一次调用可以在 glsl 计算着色器中进行乒乓传播吗?