2011-12-31 33 views
1

我想知道OpenGL VBO是否仅用于大型几何阵列,或者是否适用于小型阵列也是有意义的。我有相对于其他几何体定位各种几何体的代码,但一些“叶”几何体对象非常小,10x10四球体等(每个200个三角形)。我可能有很多这些小叶子对象。我希望能够为每个这些小叶子对象提供一个不同的变换矩阵。看起来我有两种选择:使用大量小型VBO的性能

  1. 为每个叶对象使用一个单独的VBO。我最终可能会有大量的维也纳国际组织。

  2. 我可以将多个对象的数据存储在一个VBO中,并在更改给定叶对象的数据时自己应用适当的转换。这看起来很奇怪,因为OpenGL的一部分就是要在硬件中有效地执行大量的矩阵运算。我会用软件来完成OpenGL设计用于硬件的很好的功能。

是否有大量的VBO效率低下,还是应该继续选择选项1?有没有更好的方法来处理有很多小物体的情况?我是否应该使用顶点数组或类似的东西?

回答

1

一些好的信息位于:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

我认为,每一个网格200个三角形也不是那么少,也许与VBO网格不会下降这么大的性能为每一点。不幸的是它依赖于硬件规格。

一个巨大的缓冲区不会获得巨大的性能差异...我认为最好的选择是每个VBO存储几个(但不是全部)对象。

使用一个缓冲区的renderin: 没有问题...你只需要一个绑定的缓冲区,然后你可以使用不同参数的glDrawArrays。例如,如果一个网格由100名绿党,并在第缓冲区你有这些网格10可以使用

glDrawArrays(triangles, 0, 100); 
glDrawArrays(triangles, 100, 100); 
glDrawArrays(triangles, ..., 100); 
glDrawArrays(triangles, 900, 100); 

以这种方式,你尽量减少改变缓冲区和你仍然能够使其非常有效。

这些“小”对象是否一样?它们是否具有相同的几何形状但具有不同的转换/材质?因为也许值得使用“实例”?

+0

什么是实例? – Gravity 2011-12-31 20:51:27

+0

这里是一些信息:http://sol.gfxile.net/instancing.html,但基本上它是一个优化的方式,多次渲染相同的对象(但是使用不同的转换和材质) – fen 2012-01-01 16:37:18

2

最优化的解决方案如果你的数据是静态的,由一个对象的是使用display lists和一个VBO只为一个网格。否则,一般的规则是,你希望避免在主要绘制循环中进行渲染以外的任何操作。

  • 如果你永远需要添加或删除初始化后的对象(或变形的任何对象),那么它可能是更有效的一个缓冲永久绑定,改变步幅/偏移值来呈现不同的对象。

  • 如果您只有一组基本的几何图形保持静态,则使用一个VBO作为它,并为可添加/移除/变形的几何图形分开VBO。

  • 如果您可以随意删除对象或删除对象,每个对象都应该有自己的VBO,以使内存管理更加简单。

+0

即使我的几何体保持静态,我该如何处理不同变换可应用于不同叶子几何对象的事实?或者是不被认为是静态的?将所有内容放入一个缓冲区,然后使用重复的'glDrawRangeElements'调用比创建具有几何对象的缓冲区更有效吗? – Gravity 2011-12-31 21:08:03

+0

在这种情况下,我将首先为每个网格(不是每个对象,每个网格)分别设置VBO并分别处理它们的转换。如果你发现它是一个性能问题,那么我会优化。 – 2011-12-31 23:05:27

+5

哦主,显示列表已弃用..... – 2013-02-06 11:56:01