我正在研究一个使用OpenGL ES 2.0的非常小的游戏引擎。将VBO集成到我的网格类中,我遇到了一些设计问题。跨多个网格对象共享VBO
问题是我不想为每个网格实例化一个新的VBO,并且我希望VBO的大小由我加载的网格数决定(不仅仅是一个2MB的固定大小或者某个东西)。
由于没有VBO的realloc函数,我需要一次批量加载所有顶点数据。这是好的,因为我只有4或5个小网格。所以我创建了一个MeshList类。
我调用MeshList.AddMesh(Mesh网格),它聚合网格对象的顶点/索引数据,并将顶点数据/索引数据的偏移量返回到添加的网格。这样网格就知道它在VBO中的位置(但不知道它在哪个VBO中)。
但是,在调用MeshList.BindToVBO()之前,没有任何MeshList数据上传到VBO。但是现在,我的网格中没有一个知道它们在哪个VBO中。所以我正在考虑在MeshList中创建一个指向数组的指针,它指向每个Mesh类中的整数成员变量,它们将保存VBO句柄。这样,当调用BindToVBO()时,它遍历指针数组并更新网格对象中的VBO句柄。
我想通过这种方式,我可以灵活地在不同的维修机构或不同的维修机构中使用不同的网格对象。我唯一担心的是这是否是一个好设计。
对于那些对MeshList.BindToVBO()更新整个网格对象的代码进行一番审视并不清楚。我的意思是,MeshList确实在BindToVBO()调用之前与所有Mesh对象进行交互,但没有任何明确说明通过将Mesh对象传递给MeshList.AddMesh(),它本质上是订阅它的VBOHandle成员以在某些时刻更新未来。
我试过尽可能地澄清这一点。让我知道是否需要澄清。
这种方法引发的一个后果就是将网格数据的生命周期绑定在一起。如果你想更换一个网格与另一个?您可以上传完整的网格数据,也可以对VBO数据缓冲区进行分段。 – 2012-04-27 05:20:06