我有点困惑,为什么这仍然呈现。我认为你需要绑定一个顶点缓冲区对象,以便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);
答案 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/
的一个很好的解释