2011-02-08 69 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上不断切换事物的代价是昂贵的。试验和错误是游戏的名称(游戏正在编程)。