当着色器未绑定时,是否设置制服和顶点属性值

时间:2016-02-11 07:16:01

标签: opengl opengl-es glsl

我想知道如果着色器程序未绑定然后反弹,是否保留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

1 个答案:

答案 0 :(得分:2)

<强>制服

制服是着色器程序对象的一部分。因此,即使程序对象未绑定,它们也会保存。 OpenGL 4.5 Specification对此说:

  

7.6统一变量

     

默认统一块中的制服,除了子程序制服外,都是   程序对象特定的状态。它们在加载后保留其值及其值   只要程序对象具有,只要程序对象被使用,就会被恢复   没有重新联系。

<强>属性

属性绑定是VAO状态的一部分。当没有绑定VAO时,则使用默认VAO(这是btw。在Core Profile中不允许)。使用VAO时,恢复属性绑定非常简单,因为重新绑定VAO就足够了。在另一种情况下,我会看看&#34; Associated Gets&#34;第here节。