2017-04-26 12 views
0

1つの頂点バッファから複数のオブジェクトをレンダリングする際に問題があります。 私はすべての頂点と複数のIBOを含むVBOを持っています。 私は、n個のIBOに対してn個のVAOを作成し、このVAOごとにVBOとIBOの1つをバインドすることを考えました。本当にこれを修正する方法を知らないでください。単一のVBOと複数のIBO

// all indices 
std::vector<std::vector<unsigned int>> allIndices; 

// gen buffers for ibos 
glGenBuffers(allIndices.size(),ibos); 
// gen vaos 
glGenVertexArray(allIndices.size(),vaos); 

// vbo for vertices 
glGenBuffers(1,&vbo); 
glBindBuffer(GL_ARRAY_BUFFER,vbo); 
glBufferData(GL_ARRAY_BUFFER,...); 

// bind VAOn + IBOn + VBO 
for(unsigned int x = 0; x < allIndices.size(); x++) { 
    glBindVertexArray(vao[x]); 

    // bind current ibo 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo[x]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); 

    // 
    glBindBuffer(GL_ARRAY_BUFFER,vbo); 
    // how to bind this buffer to the vao without uploading the data once more? 

    glBindVertexArray(0); 
} 

私の第二のアイデアは、あなたが使用するすべてのVAOにごVBOを取り付けたことはありません

+0

corectタグを使用します。これはCではありません。 – Olaf

+0

"もう一度データをアップロードせずにこのバッファをvaoにバインドするにはどうしたらいいですか?*"最初にこのバッファをVAOに接続したことはありません。バッファにデータをアップロードすると、そのバッファを頂点データに使用すること(*頂点データを渡す以外)は*何も*できません。 –

答えて

0

()すべてのインデックスをconcatinateとglDrawRangeElementsでそれらを呼び出すことでした。各vaoには両方のバッファーが接続されている必要があります。しかし、VBOとIBOがVAOにどのように接続されているか(そしてVAOを使用しない場合はパイプライン)の混乱が少しあります。

glBindBufferをIBO(ELEMENT_ARRAY_BUFFERターゲット)と使用すると、それが意味するのは、バッファをインデックスバッファとしてパイプラインまたはVAOに設定する点です。ただし、glBindBufferをVBO(ARRAY_BUFFERターゲット)と使用すると、内部変数の並べ替えのみが設定され、VBOに関連する次のコマンドでそのバッファが使用されることが示されます。 glVertexAttribPointerを呼び出すと実際のバインディングが発生し、最後にバインドされたVBOが暗黙的に使用されます。

それぞれの調整されたIBOに正しいインデックスを持たせるか、glDrawElementsBaseVertexファンクションを正しいオフセット(元のメッシュインデックスを使用する場合)を使用するか、正しいVAOごとの頂点データを使用してください作成します。

一般に、状態の変化を最小限に抑え、多くのIBOやVAOがこの問題を解決するのに役立ちません。 1つの大きな頂点/インデックス配列にできるだけ多くのデータを持ち、大きなバッファの異なる "部分"をレンダリングするためにglDrawElementsBaseVertex関数を使用する方が良いでしょう。

関連する問題