2011-02-08 117 views
1

我有不同的模型,我想在OpenGL中渲染。每個模型都有不同的頂點和索引。opengl中的vbo管理

使用vbo渲染這些模型時,我應遵循的最佳做法是什麼?我應該爲每個模型製作一個VBO以渲染它嗎?我讀到,使用幾個小的維也納國際中心組織將會是一個很大的表現,以及使用幾個大的維也納國際組織。

例如:我有一個盒子和一個汽車旁邊,這裏的箱子是8個頂點和汽車是2000年的頂點,這是完全不同的數字。我有不同的模型,它們有時可能會消失,這意味着這些模型應該從服務器端緩衝區中刪除。我怎樣才能做到這一點 ?

也許有人可以指導我寫一篇清除這種困惑的文章,並展示處理我的情況的好方法。

回答

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上不斷切換事物的代價是昂貴的。試驗和錯誤是遊戲的名稱(遊戲正在編程)。