【发布时间】:2016-06-13 06:11:36
【问题描述】:
我想知道如何在我们解除绑定和重新绑定程序时恢复所有属性绑定。据我所知,如果我使用的是 VAO,它就像反弹 VAO 一样简单,但我不确定我什么时候不使用 VAO。我正在创建 VBO,但不是 VAO。
如果我执行以下操作
glUseProgram(shader1);
// Now set uniforms.
glUniformMatrix4fv(matrix_handdle, 1, false, matrix);
glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
glEnableVertexAttribArray(m_attributes[position_1]);
glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 3 * sizeof(GLfloat), 0);
现在保存当前程序,vbo 绑定。然后使用第二个程序
glUseProgram(shader2);
//bind some new vbo, set some uniform, vertex attribute variable.
element.draw();
然后再次使用第一个着色器程序。重新绑定 vbo
glUseProgram(shader1); //Here, do the attributes set in first shader program remain?
element.draw();
我认为我需要使用 glGetVertexAttrib() 函数获取所有顶点属性的大小、步幅、类型、规范化标志、缓冲区绑定和数组指针的顶点属性值并保存它们。然后当我重新绑定程序时,我将设置顶点属性值。我想我需要通过使用 GL_MAX_VERTEX_ATTRIBS 来获取着色器程序的 Max 属性,然后保存/恢复所有属性位置的值。是正确还是我在某个地方错了?
【问题讨论】: