我想知道如何在解除绑定和反弹程序时恢复所有属性绑定。据我所知,如果我使用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属性,然后保存/恢复所有属性位置的值。这是正确的还是我错了?
答案 0 :(得分:2)
使用glVertexAttribPointer
定义如何将VBO数据绑定到着色器调用。所以你能做的就是拨打glVertexAttribPointer
一次或多次,e。 G。定义顶点位置,法线和纹理数据,然后绘制。
VAO的目的是为您省去这些多次拨打glVertexAttribPointer
的麻烦。您无需在绘制前调用glVertexAttribPointer
,而是将状态存储在VAO中,然后您只需在绘制前调用glBindVertexArray
一次。所以VAO的全部意义在于你没有自己存储状态,你让VAO处理它。有很多关于如何做到这一点的教程。
只要着色器使用相同的输入格式,就可以使用具有相同VAO的多个着色器。
旁注:请尝试一次提出一个问题。谢谢。 :)
答案 1 :(得分:2)
现在保存当前程序,vbo binded。
程序对象不具有绑定到它们的缓冲区。 自从。除程序对象所编译的程序之外唯一的状态是统一状态。
顶点阵列不是制服。
用于顶点数据的缓冲区可以存储在顶点数组对象(VAO)中。如果您无法访问VAO,则每次要使用这些缓冲区进行渲染时都必须重置此状态。这意味着您每次都必须进行glBindBuffer
,glEnableVertexAttribArray
和glVertexAttribPointer
来电。
存在VAO以避免这样做。但是,如果你无法访问它们,那么你就可以使用它拥有的东西。