为什么我不需要在调用glDrawArrays之前绑定我的顶点缓冲区对象?

时间:2013-11-08 11:52:10

标签: c++ opengl-es opengl-es-2.0

我有点困惑,为什么这仍然呈现。我认为你需要绑定一个顶点缓冲区对象,以便glDrawArrays知道要使用哪个顶点缓冲区。

这是我的初始化代码..

// Create and bind vertex array to store vertex attribute states.

glGenVertexArraysOES(NUM_VERTEX_ARRAYS, &m_vertexArray);
glBindVertexArrayOES(m_vertexArray);

// Create and bind vertex buffer to store vertex data.

glGenBuffers(NUM_VERTEX_BUFFERS, &m_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 36, &m_vertices[0], GL_STATIC_DRAW);

glEnableVertexAttribArray(VertexAttribPosition);
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(VertexAttribNormal);
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArrayOES(0);

这是我的渲染代码。我很困惑为什么当我将0绑定到GL_ARRAY_BUFFER时glDrawArrays仍然有效。

glBindVertexArrayOES(m_vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glDrawArrays(GL_TRIANGLES, 0, 36);

glBindVertexArrayOES(0);

2 个答案:

答案 0 :(得分:4)

  

我认为你需要绑定一个顶点缓冲区对象,以便glDrawArrays知道要使用哪个顶点缓冲区。

调用glDraw…时,它会使用最近调用gl…Pointer(或等效)调用所发送的数据,并由glEnableVertexAttribArray激活。当你这样做

glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

形成(活动)顶点属性和缓冲对象之间的关联。或者换句话说: glBindBuffer仅与拨打glBuffer… gl…Pointer来电相关。因此您可以安全地绑定不同的调用gl…Pointer函数后调用缓冲区对象。事实上,以下内容也可行:

glBindBuffer(GL_ARRAY_BUFFER, m_vertexPositionBuffer);    
glVertexAttribPointer(VertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

glBindBuffer(GL_ARRAY_BUFFER, m_vertexNormalBuffer);    
glVertexAttribPointer(VertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

,即每个顶点属性数组使用不同的缓冲区对象。

更新

顶点数组对象通过使绑定→指针/偏移关联保持在对象本身可以被绑定,为此添加一些糖涂层。因此,切换到一个新的(一组)缓冲区对象变得不那么重要了。

答案 1 :(得分:-1)

您正在使用顶点数组对象,因此所有数据都已记录到VAO中。以下是VAO所持数据http://www.altdevblogaday.com/2013/10/18/ios-open-gl-es-2-multiple-objects-at-once/

的一个很好的解释