我想知道OpenGL VBO是否仅用于大型几何数组,或者即使对于小型数组也是如此。我有相对于其他几何定位各种几何的代码,但是一些“叶”几何对象非常小,10x10四角球等(每个200个三角形)。我可能有很多这些小叶子物体。我希望能够为这些小叶对象中的每一个提供不同的变换矩阵。看来我有两个选择:
为每个叶对象使用单独的VBO。我最终可能会有大量的VBO。
我可以在一个VBO中存储多个对象的数据,并在更改给定叶对象的数据时自己应用相应的变换。这看起来很奇怪,因为OpenGL的部分要点是在硬件中有效地执行大量的矩阵运算。我将在软件方面做一些事情,OpenGL旨在在硬件方面做得很好。
是否有大量的VBO效率低下,或者我应该继续选择选项1?有没有更好的方法来处理有很多小物件的情况?我应该使用顶点数组还是类似的东西?
答案 0 :(得分:2)
最佳解决方案如果您的数据是静态的并且由一个对象组成将使用display lists而一个VBO仅用于一个网格。否则,一般规则是你要避免在主绘制循环中进行渲染以外的任何操作。
如果您在初始化之后永远不需要添加或删除对象(或变形任何对象),那么永久绑定单个缓冲区并更改步幅/偏移值以渲染不同的对象可能更有效。 / p>
如果您只有一组基本的几何体将保持静态,请使用单个VBO,并为可以添加/删除/变形的几何体分开VBO。
如果您可以随意删除对象或删除对象,则每个对象都应该拥有自己的VBO,以使内存管理更加简单。
答案 1 :(得分:1)
一些好的信息位于:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices
我认为每个网格中有200个三角形的数量不是很少,而且每个网格的VBO性能也不会下降太多。不幸的是,它取决于硬件规格。
一个巨大的缓冲区不会产生巨大的性能差异......我认为最好的选择是每个VBO存储几个(但不是全部)对象。
使用一个缓冲区渲染: 没有问题...你只需要一个绑定的缓冲区,然后你可以使用不同参数的glDrawArrays。例如,如果一个网格由100个顶点组成,并且在缓冲区中,您可以使用其中的10个网格
glDrawArrays(triangles, 0, 100);
glDrawArrays(triangles, 100, 100);
glDrawArrays(triangles, ..., 100);
glDrawArrays(triangles, 900, 100);
通过这种方式,您可以最大限度地减少更改缓冲区,并且您仍然可以非常有效地呈现它。
这些“小”物体是否相同?他们是否具有相同的几何形状但不同的变形/材料?因为也许值得使用“实例化”?