在iOS 5.1的股票OpenGL ES应用程序,他们真的在使用他们声明的顶点数组吗?
在股票OpenGL ES应用程序中(当您在XCode中创build一个新的“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
命令,代码似乎工作完全相同。
glBindVertexArrayOES
在这个glBindVertexArrayOES
调用无关的内容吗?
您将顶点数组与顶点数组对象混淆(术语混淆)。
这条语句:“(据我所知,顶点数组停留在客户端内存,而顶点缓冲区驻留在OpenGL服务器内存)”适用于客户端顶点数组。 当你想保持你的顶点缓冲区在本地时,这些被用来代替“顶点缓冲区对象”,从而为glDrawElements / gl *指针提供一个原始的内存指针。
另一方面, 顶点数组对象是一个OpenGL构造,它包含绘制对象所需的所有指针。 名称中带有“VertexArray”的任何OpenGL函数都适用于“顶点数组对象”,而不适用于客户端顶点数组。
你可以在这里阅读更多关于VAO:
http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object