1

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

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

例: 箱とその隣に車があり、箱の頂点数は 8、車の頂点数は 2000 で、これはまったく異なる数です。私はさまざまなモデルを持っていますが、それらも時々消えることがあります。つまり、これらのモデルはサーバー側のバッファから削除する必要があります。どうやってやるの ?

誰かがこの混乱を解消し、私の状況を処理するための良い方法を示す記事に私を案内してくれるかもしれません.

4

1 に答える 1

3

私は遊んで、あなたに適したバッファサイズを見つけ、可能であれば頂点データをVBOに結合します。ターゲット ハードウェアが実際にこれを決定するので、さまざまな数値を試してみることをお勧めします。

モデルが実際にレンダリングに使用する必要がある 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 のオンとオフを常に交換することはコストがかかります。試行錯誤はゲームの名前です (ゲームはプログラミングです)。

于 2011-02-08T14:12:32.737 に答える