OpenGL ES2(iOS上)でVAOを使用する方法を理解し、それらを機能させるのに問題があります。私の現在のレンダリング設定は次のようになります(擬似コード):
初期化:
foreach VBO:
glGenBuffers();
フレームのレンダリング:
// Render VBO 1
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO1);
foreach vertex attribute:
glVertexAttribPointer();
glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);
// Render VBO 2
glClear(color | depth);
glBindBuffer(GL_ARRAY_BUFFER, arrayVBO2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO2);
foreach vertex attribute:
glVertexAttribPointer();
glEnableVertexAttribArray();
glBufferData(GL_ARRAY_BUFFER, ...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, ...);
glDrawElements(GL_TRIANGLE_STRIP, ...);
これは正常に機能しますが、両方のVBOにはまったく同じインターリーブ頂点属性構造体があります。ご覧のとおり、すべてのVBOのフレームごとに各属性を設定して有効にしています。InstrumentsはglVertexAttribPointer()とglEnableVertexAttribArray()への冗長な呼び出しについて文句を言いますが、それらの一方または両方を初期化フェーズに移動すると、glDrawElementsを呼び出すときにEXC_BAD_ACCESSを取得するか、何も描画されません。
私の質問は、これをフレームごとに行う必要があるかどうか、そうでない場合になぜ機能しないのか、そしてこれを解決するためにVAOをどのように使用するのかということです。