1

(XCodeで新しい「OpenGLゲーム」を作成するときに)取得するストックOpenGL ESアプリには、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 に答える