我想知道如果着色器程序未绑定然后反弹,是否保留uniform和vertex属性变量值
基本上我想问这个问题Do uniform values remain in GLSL shader if unbound?。但我想知道这是否适用于制服和归属变量?
如果我这样做
glUseProgram(shader1);
// Now set uniforms.
glUniform4fv(m_uniforms[COLOR_HANDLE], 1, color.AsFloat());
glUniformMatrix4fv(m_uniforms[MVP_HANDLE], 1, false, matrix);
glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
glEnableVertexAttribArray(m_attributes[POSITION_HANDLE1]);
glEnableVertexAttribArray(m_attributes[POSITION_HANDLE2]);
glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 3 * sizeof(GLfloat), 0);
现在保存当前程序,vao,vbo binded。 然后使用第二个程序
glUseProgram(shader2);
//bind some new vao, vbo, set some uniform, vertex attribute variable.
element.draw();
然后再次使用第一个着色器程序。重新绑定vbo,vao
glUseProgram(shader1); //Here, do the uniforms and attributes set in first shader program remain?
element.draw();
这是否意味着恢复完整状态并且绘制调用将起作用。我认为如果保留制服和属性值,这应该有用。因此,当我使用glUseProgram恢复客户端程序时,将恢复客户端设置的所有制服和属性。
如果没有,那我怎样才能保存完整状态。客户必须再次设置它们。但如果这不是一种选择,那么还有什么方法。如何保存完整状态并在以后恢复。它甚至可能吗?
PS:我需要为opengl 2.0,opengl 3.2 +,opengl es 2.0,opengles 3.0
做答案 0 :(得分:2)
<强>制服强>
制服是着色器程序对象的一部分。因此,即使程序对象未绑定,它们也会保存。 OpenGL 4.5 Specification对此说:
7.6统一变量
默认统一块中的制服,除了子程序制服外,都是 程序对象特定的状态。它们在加载后保留其值及其值 只要程序对象具有,只要程序对象被使用,就会被恢复 没有重新联系。
<强>属性强>
属性绑定是VAO状态的一部分。当没有绑定VAO时,则使用默认VAO(这是btw。在Core Profile中不允许)。使用VAO时,恢复属性绑定非常简单,因为重新绑定VAO就足够了。在另一种情况下,我会看看&#34; Associated Gets&#34;第here节。