2012-04-26 139 views
0

我正在研究一个使用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成员以在某些时刻更新未来。

我试过尽可能地澄清这一点。让我知道是否需要澄清。

+0

这种方法引发的一个后果就是将网格数据的生命周期绑定在一起。如果你想更换一个网格与另一个?您可以上传完整的网格数据,也可以对VBO数据缓冲区进行分段。 – 2012-04-27 05:20:06

回答

0

老实说对我来说听起来像一个可疑的回报很多麻烦。您是否有理由相信将多个网格放入同一个缓冲区将会使您的性能显着提升?

这听起来像是对我不成熟的优化。

当然,如果你有一个含有50,000个粒子的粒子系统,我可以看到它想要在一个共享缓冲区中,但是总的来说,我不知道在同一个缓冲区中存储两个任意网格是否有好处。这听起来像是一个巨大的潜在的错误和头痛。

+0

我同意肯定有一个成本/收益分析要做,以确定是否值得将网格放在一个VBO与每个绘制调用绑定VBO的努力。但是我正在设计我的程序,所以我可以决定将哪个网格放在哪个VBO中,而不是每个网格都有一个单独的VBO,或者总是在一个VBO中包含所有网格。 – Legion 2012-04-27 14:07:54

+0

@Legion所以这里有什么问题呢? – Tim 2012-04-27 16:10:53

+0

基本上我想知道是否它被认为是不好的设计有一个类A包含指向B类成员变量的指针列表。类A可以使用这些指针来更新B类成员的值。我担心的是,它可能会导致B类国家的非明显变化。所以ClassA.doSomething()会影响B类。 – Legion 2012-04-27 16:53:22