【问题标题】:Vertex Buffer Objects in OpenGL 2.1OpenGL 2.1 中的顶点缓冲对象
【发布时间】:2011-08-08 14:52:18
【问题描述】:

(我指定 2.1 是因为我的笔记本电脑不会超过那个版本。我可能会在 3.x 之后将着色器引入强制执行?)。

感谢维基百科:http://en.wikipedia.org/wiki/Vertex_Buffer_Object 我开始明白使用 VBO 是多么简单(我仍然对 IBO 不满意?)。到目前为止,我所理解的是,使用它们的主要原因是由于数据现在存储在视频内存中,从而提高了性能。

我想知道的是我应该如何在实际环境中使用它们。例如,我所看到的都是设置一个 Vertex Buffer Object 并绘制一个三角形或一个立方体等。如果我想绘制 2 个或更多怎么办?我是否为每个要绘制的实体设置一个新的 VBO?还是我会神奇地附加到我早期设置的一些静态 VBO?

【问题讨论】:

  • 完全不相关的评论:一个人怎么能对 VBO 而不是对 IBO 持积极态度,因为如果你理解前者,它们就更简单了。而在实际应用中你会经常使用glDrawElements而不是glDrawArrays
  • @Christian Rau:我的问题可能还不够清楚,我很好奇我是否必须创建多个 VBO 而不是一个全局 VBO。
  • 我理解(并回答了)您的问题。只是 IBO 并没有像 Ken 所说的那样与 VBO 不同或更难。

标签: c opengl vbo


【解决方案1】:

这取决于问题,因为问题相当广泛。

对顶点属性使用一个 VBO,对每个模型/对象/实体/网格的索引使用一个 VBO 是直截了当的方法。您可能会受益于将所有模型存储在单个 VBO 中,因此您不必过于频繁地绑定缓冲区,但是当这些模型不是那么静态时,这会带来其他问题。此外,您可以为每个对象使用多个 VBO,可能一个用于动态数据,一个用于静态数据,或者一个用于几何数据(位置...),一个用于材质相关数据(texCoords...)。

每个对象使用一个 VBO 可能有它的(缺点)优点,并且使用单个巨大的 VBO 可能不是一个好主意。它只取决于具体的应用程序以及这些概念在多大程度上适合它。但一开始,直接的一个 VBO-per-object 方法并不是一个坏主意。只是不要每个三角形使用一个 VBO ;)

【讨论】:

  • 我能否在每个 Quad 中使用一个 VBO 和 IBO?我正在设置一个精灵对象。
  • @Storm 每个四边形可以使用一个 VBO,但每次绘制调用只能渲染一个四边形,这可能适用于您的精灵对象(仅包含一个四边形)。但是,如果您有许多完全相同的精灵(例如在粒子系统中),那么这肯定是一种情况,您应该将所有这些精灵/粒子打包到一个 VBO 中,这样您就可以一次渲染所有这些精灵。就像我说的,这取决于具体的应用程序,粒子系统肯定是支持 one-VBO 方法的一种。
  • 这是有道理的。有没有办法批量处理非相似精灵的精灵绘制调用?我认为 XNA 用他们的 SpriteBatch 做到了这一点。
  • @Storm 问题是,您不能以这种方式更改每个精灵的纹理(或其他此类渲染参数)。您可以做的是按纹理/材质/着色器/...对精灵进行排序,然后相应地对它们进行批处理。否则,您将不得不采用更高级的批处理技术,例如纹理图集、纹理数组或实例渲染。
  • @Storm 顺便说一句,XNA SpriteBatch 似乎只包含一个精灵图像,但我只是瞥了一眼,没有任何 XNA 经验。
【解决方案2】:

这应该很容易 - 只需向 VBO 添加更多数据。

因此,例如,如果您想渲染 3 个三角形而不是 1 个,请确保将 9 个顶点发送到 glBufferData。然后,要渲染所有这些,使用调用glDrawArrays(GL_TRIANGLES, 0, 9); 真的应该这么简单。

然而,关于 IBO 的一点是,它们实际上与 VBO 并没有太大区别,我真的会习惯使用它们。这确实是使用 VBO 的实用方法。由于多个三角形通常意味着覆盖同一个表面(例如,一个立方体需要十二个三角形),因此仅使用 VBO 会导致在指定顶点数据时出现大量重复。通过使用索引缓冲区,事情变得更加高效,因为从 VBO 中删除了任何重复。我找到了this,它提供了一个从纯 VBO 迁移到 VBO/IBO 的简明示例,并且很好地解释了这种变化。

【讨论】:

  • 是的,今天才找到这本书,对他简洁的文笔印象深刻。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多