2011-02-08 7 views
1

OpenGLでレンダリングしたいモデルがあります。すべてのモデルには異なる頂点とインデックスがあります。OpenGLでのvbo管理

vboを使用してこれらのモデルをレンダリングするときに従うべきベストプラクティスは何ですか?それをレンダリングするために私は各モデルのためのVBOを作る必要がありますか?私はいくつかの小さなVBOsを使用することは大きなパフォーマンスのヒットだけでなく、いくつかの大きなVBOsを使用することをお読みください。

例:ボックスとその横の車があります。箱は8頂点で、車は2000頂点です。これは全く異なる数です。私は異なるモデルを持っており、時にはそれらも消えるかもしれません。つまり、これらのモデルをサーバー側のバッファから削除する必要があります。どうやってやるの ?

誰かがこの混乱を解消し、自分の状況を処理する良い方法を示す記事に私を導くことができるかもしれません。

答えて

3

私はあなたのためにうまく動作し、できるだけVBOにあなたのvertデータを結合バッファーサイズを見つけるだろう。あなたのターゲットハードウェアは本当にこれを指示するものなので、別の番号で遊ぶのが最善です。

モデルをレンダリングに実際に使用するVBOのオフセットを参照するために、いくつかのクラスを使用します。たとえば、あなたは箱と車を持っています。

class MeshManager 
{ 
public: 
    int loadMesh(const Mesh * mesh) 
    { 
     //load the mesh 
     //Add it to some current VBO or manage the creation of VBOs better. 
     ManagedMesh managedMesh(theVao, theVbo, theOffset, theLength, theType, theIdentifier); 
     theIdentifier++; 
    } 
private: 
    std::map<std::string, ManagedMesh> meshMap; 
    int theIdentifier; 
} 

class Renderer 
{ 
public: 
    void render(int meshId, Vector3f translation, Vector3f rotation); 
} 

int main(int argc, char** argv) 
{ 
MeshManager meshManager; 
Model model("mymodel.obj"); 
const Mesh * meshes = model.getMeshes(); 
int meshCount = model.getMeshCount(); 
for(int i=0; i<meshCount; i++) 
{ 
    meshManager.loadMesh(mesh); 
} 
model.freeMeshes(); 
} 

何かの並べ替え。明らかに私はそれらの読み込まれたメッシュIDを格納していませんが、私はあなたが画像を取得すると思います。私は専門家ではありませんが、これは私がそれについてどうやって行くかの大まかな例です。また、バッチレンダリングを可能な限り試してみてください。レンダリングをソートするには、1)ロードする必要のあるVBO、2)ロードする必要があるマテリアルをソートします。 GPUのオン/オフを常にスワッピングするのはコストがかかります。試行錯誤はゲームの名前です(ゲームはプログラミングです)。