如果未绑定,统一值是不是保留在 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 着色器中?的主要内容,如果未能解决你的问题,请参考以下文章