在你得到的普通OpenGL ES应用程序中(当你在XCode中创建新的"OpenGL游戏"时),在setupGL
函数中,有:
glEnable(GL_DEPTH_TEST);
//glGenVertexArraysOES( 1, &_vertexArray ) ; // va's are not being used!
//glBindVertexArrayOES( _vertexArray ) ; // we comment these out
// to no ill effect -- are these calls extraneous?
glGenBuffers( 1, &_vertexBuffer ) ;
glBindBuffer( GL_ARRAY_BUFFER, _vertexBuffer ) ;
glBufferData( GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW ) ;
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
//glBindVertexArrayOES(0);
但是,似乎没有使用顶点数组(据我所知,顶点数组保留在客户端内存中,而顶点缓冲区停放在 OpenGL 服务器内存上)。
如果您注释掉glBindVertexArrayOES
命令,代码似乎完全相同。
此 xCode 示例中的glBindVertexArrayOES
调用是否无关?
您将顶点数组与顶点数组对象混淆了(术语令人困惑)。
此语句:"(据我所知,顶点数组保留在客户端内存中,而顶点缓冲区停放在 OpenGL 服务器内存上)"适用于客户端顶点数组。当您希望将顶点缓冲区保留在本地时,使用这些来代替"顶点缓冲区对象",从而提供指向 glDrawElements/gl*Pointer 的原始内存指针。
另一方面,顶点数组对象是一个 OpenGL 构造,其中包含绘制对象所需的所有指针。任何名称中带有"VertexArray"的OpenGL函数都适用于"顶点数组对象",而不是客户端顶点数组。
您可以在此处阅读有关VAO的更多信息:
http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object