如何在程序未绑定后再恢复属性绑定

时间:2016-06-13 06:11:36

标签: opengl opengl-es

我想知道如何在解除绑定和反弹程序时恢复所有属性绑定。据我所知,如果我使用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属性,然后保存/恢复所有属性位置的值。这是正确的还是我错了?

2 个答案:

答案 0 :(得分:2)

使用glVertexAttribPointer定义如何将VBO数据绑定到着色器调用。所以你能做的就是拨打glVertexAttribPointer一次或多次,e。 G。定义顶点位置,法线和纹理数据,然后绘制。

VAO的目的是为您省去这些多次拨打glVertexAttribPointer的麻烦。您无需在绘制前调用glVertexAttribPointer,而是将状态存储在VAO中,然后您只需在绘制前调用glBindVertexArray​一次。所以VAO的全部意义在于你没有自己存储状态,你让VAO处理它。有很多关于如何做到这一点的教程。

只要着色器使用相同的输入格式,就可以使用具有相同VAO的多个着色器。

旁注:请尝试一次提出一个问题。谢谢。 :)

答案 1 :(得分:2)

  

现在保存当前程序,vbo binded。

程序对象具有绑定到它们的缓冲区。 自从。除程序对象所编译的程序之外唯一的状态是统一状态。

顶点阵列不是制服。

用于顶点数据的缓冲区可以存储在顶点数组对象(VAO)中。如果您无法访问VAO,则每次要使用这些缓冲区进行渲染时都必须重置此状态。这意味着您每次都必须进行glBindBufferglEnableVertexAttribArrayglVertexAttribPointer来电。

存在VAO以避免这样做。但是,如果你无法访问它们,那么你就可以使用它拥有的东西。