iOS 5 のストック「回転キューブ」OpenGL の例では、次のコードがあります。
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));
めちゃくちゃな部分は への最後の引数glVertexAttribPointer
です。ドキュメントによると、最後の引数は配列へのポインターです。
しかし、このプログラムでは、まっすぐな数を使用しています。実際、BUFFER_OFFSET
次のように定義されます。
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
gCubeVertexData
では、メモリ アドレス 0 から始まる配列に依存しているのでしょうか。
だから、私は2つのことを理解していません:
コードの 3 行目を次のように「修正」すると、例が機能しない(立方体が描画されない)のはなぜですか?
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, gCubeVertexData );
glVertexAttribPointerを呼び出す正しい方法は何ですか?
ドキュメントにあるように、最後のインデックスのメモリ ポインターを渡すことになっていると思いました。実際、ここで別のサンプルが glVertexAttribPointer を使用しています。
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStruct), &vertices[0].position);
glEnableVertexAttribArray(ATTRIB_POSITION);
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(vertexStruct), &vertices[0].color);
glEnableVertexAttribArray(ATTRIB_COLOR);
したがって、後者の例では、直接の数値ではなく、ポインター (最後の引数) のメモリアドレスが渡されていることがわかります。