当着色器未绑定时,制服集和顶点属性值是否保留

Does uniforms set and vertex attributes values remain when shader is unbound

我想知道如果shader程序解绑然后反弹,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绑定。 然后使用第二个程序

    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 做这件事

制服

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

7.6 Uniform Variables

Uniforms in the default uniform block, except for subroutine uniforms, are program object-specific state. They retain their values once loaded, and their values are restored whenever a program object is used, as long as the program object has not been re-linked.

属性

属性绑定是 VAO 状态的一部分。当没有绑定 VAO 时,将使用默认 VAO(顺便说一下,在 Core Profile 中是不允许的)。使用 VAO 时,恢复属性绑定非常简单,因为重新绑定 VAO 就足够了。在另一种情况下,我会查看“关联获取”部分 here