在iOS 5.1上的OpenGL ES应用程序中,他们真的使用了他们声明的顶点数组吗?



在你得到的普通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

相关内容

  • 没有找到相关文章

最新更新