首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用大量小型VBO的性能

使用大量小型VBO的性能
EN

Stack Overflow用户
提问于 2011-12-31 10:40:19
回答 2查看 2.2K关注 0票数 1

我想知道OpenGL VBO是否意味着只用于大型几何图形数组,或者即使对小型数组也使用它们是否有意义。我有代码定位各种几何相对于其他几何,但一些“叶”几何对象是相当小的,10x10四边形球和类似的(每个200三角形)。我可能有很大数量的这些小叶子对象。我希望能够对每个小叶对象有一个不同的变换矩阵。看来我有两个选择:

  1. 对每个叶对象使用单独的VBO。我可能最终会有大量的VBO。
  2. 我可以将多个对象的数据存储在一个VBO中,并在为给定的叶子对象更改数据时自己应用适当的转换。这似乎很奇怪,因为OpenGL的部分目的是有效地在硬件中执行大量的矩阵运算。我会在软件方面做一些OpenGL设计用来在硬件方面做得很好的事情。

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

EN

回答 2

Stack Overflow用户

发布于 2011-12-31 11:39:06

如果您的数据是静态的,并且由一个对象组成,最理想的解决方案是只对一个网格使用显示列表和一个VBO。否则,一般规则是,除了在主绘制循环中呈现之外,您希望避免做任何其他事情。

  • 如果您永远不需要在初始化后添加或移除对象(或改变任何对象),那么永久绑定单个缓冲区并更改then /偏移值以呈现不同的对象可能更有效。
  • 如果您只有一组将保持静态的基本几何图形,那么可以使用单个VBO,而对于可以添加/删除/变形的几何图形,则使用单独的VBO。
  • 如果您可以随意放置对象或删除对象,那么每个对象都应该有自己的VBO,从而使内存管理更加简单。
票数 2
EN

Stack Overflow用户

发布于 2011-12-31 11:26:04

一些好的信息位于:实践

我认为每一个网格有200个三角形并不是很小,也许VBO对每个网格的性能都不会降低那么多。不幸的是,它依赖于硬件规范。

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

使用一个缓冲器:这没有问题.您只需绑定一个缓冲区,然后就可以使用具有不同参数的glDrawArrays。例如,如果一个网格由100个verts组成,并且在缓冲区中,您可以使用其中的10个网格。

代码语言:javascript
复制
glDrawArrays(triangles, 0, 100);
glDrawArrays(triangles, 100, 100);
glDrawArrays(triangles, ..., 100);
glDrawArrays(triangles, 900, 100);

通过这种方式,您可以最小化变化的缓冲区,并且仍然能够使其非常有效。

那些“小”物体是一样的吗?它们的几何形状相同,但变换/材料不同吗?因为也许它是值得使用的“实例”?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8687638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档