1

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をどのように使用するのかということです。

4

1 に答える 1

0

浚渫して申し訳ありませんが、私は先延ばしにしており、あなたは私のグーグル検索を上回り続けています. きっと今までに解決したと思います...

正しい方法は、すべてのフレームではなく、データが変更されたときにのみバッファを更新することです。理想的には、変更されたバッファーの部分のみを更新します。また、バッファがバインドされている場合、属性ポインタはバッファへのオフセットです。

初期化:

glGenBuffers()
foreach VBO:
   glBufferData()

更新 / アニメーションなど:

glMapBuffer() //or something like this
buffer->vertex = vec3(1,2,3) // etc
glUnmapBuffer()

そしてレンダリング:

glBindFBO()
glClear(color | depth);

glBindBuffer(GL_ARRAY_BUFFER, arrayVBO1)
glVertexAttribPointer(GL_VERTEX,..., 0) // Buffer Offset = 0
glVertexAttribPointer(GL_TEXCOORD,..., sizeof(vertex)) // Buffer Offset = size of vertex

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO1);
glEnableVertexAttribArray(..., 0) // Buffer Offset = 0

glBindBuffer(0); // Unbind buffers, you don't need them here
glDrawElements(GL_TRIANGLE_STRIP, ...);

それが役立つことを願っています。

于 2012-03-19T06:39:42.160 に答える