1

在您获得的股票 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命令,代码似乎完全一样。

glBindVertexArrayOES此 xCode 示例中的调用是否无关紧要?

4

1 回答 1

1

您将顶点数组与顶点数组对象混淆(术语令人困惑)。

此声明:“(据我所知,顶点数组保留在客户端内存中,而顶点缓冲区停放在 OpenGL 服务器内存中)”适用于客户端顶点数组。当您想将顶点缓冲区保持在本地时,这些用于代替“顶点缓冲区对象”,从而为 glDrawElements/gl*Pointer 提供原始内存指针。

另一方面,顶点数组对象是一个 OpenGL 构造,它包含绘制对象所需的所有指针。任何名称中带有“VertexArray”的 OpenGL 函数都适用于“顶点数组对象”,而不是客户端顶点数组。

您可以在此处阅读有关 VAO 的更多信息:

http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object

于 2012-09-14T17:10:46.897 回答