OpenGL:VBO或glBegin()+ glEnd()?


16

最近,我将原始OGL红皮书的读者链接到了教程站点。向下的第三个标头明确表示忘记了glBegin()和glEnd()作为典型的渲染方法。我是通过Redbook的方法学习的,但我发现VBO有一些好处。这真的是可行的方法吗?如果是,是否有一种方法可以轻松地将渲染代码和后续的着色器转换为VBO和后续的数据类型?

Answers:


27

借助现代OpenGL的VBO,固定功能的东西(包括glBegin / glEnd和介于两者之间的东西)从3.0开始被弃用,从3.1开始被删除。

使用OpenGL Core Profile,OpenGL ES 2.0+和WebGL,您甚至都无法访问旧版本。

有人认为先学习旧知识会更好一些,因为它比较容易,但是您学到的东西几乎是无用的,然后您必须取消学习。

这不仅是VBO,还需要对所有内容使用着色器并自己进行矩阵转换(或使用GLM)。

使用旧版本的唯一原因是,如果您想在2.0之前使用OpenGL。该版本早在2003年就发布了。有一些非常糟糕的嵌入式上网本芯片组是1.5,但即使1.5也应该支持VBO,而不仅仅是着色器。或基于固定功能管线的OpenGL ES 1.x(例如,在较旧的iPhone上使用)。或OpenGL SC(用于安全关键型系统)。

以下所有常用功能均已弃用:

  • glBegin
  • glEnd
  • glVertex *
  • glNormal *
  • glTextCoord *
  • glTranslate *
  • 旋转*
  • glScale *
  • glLoadIdenity
  • glModelViewMatrix

opengl-tutorial.org教程有什么,我认为是去学习的OpenGL的最佳途径。他们依靠一些旧的兼容性材料,但实际上并没有教您。例如,您不应该在没有着色器的情况下渲染任何东西,但是它确实可以工作。而且您需要自己处理矩阵操作(旋转,平移等),但是默认情况下,您将获得基本的平面2D视口。

除了避免不推荐使用的东西外,还有很多使OpenGL编码更好的函数,但是对于其中的许多函数,您必须确定是否可以接受较新的OpenGL 3.x +版本和兼容的硬件。

我在这里发表的文章中有更多信息。

如果由于某种原因确实需要支持较旧的OpenGL,则可以在可能的情况下使用VBO,而在可能的情况下可以使用VBO,提供使用glBegin / glEnd的后备并循环遍历顶点数据。

另一方面,没有真正的“简便”方法可以上转换旧的渲染代码。您也许可以实现自己的函数版本,将顶点添加到数组/向量中,然后将其转储到VBO中,并在调用伪造glEnd时将其绘制。但这将是非常低效的,因为它将在每个帧中执行(除非您只进行一次检查,但这不适用于动画对象),并且可能要做的只是切换到VBO。我想如果您有很多代码,该方法可能会起作用。


7

使用VBO,通常有两个主要优点。

优势1与完全静态的数据有关,它源于将顶点数据保存在内存中的能力,这对于GPU来说是最佳的。

优势2与动态数据有关,源于能够在将其用于渲染之前的任何时间指定您的顶点数据,这可以更好地进行流水线处理。

第三个优点来自于绘图调用批处理,但也与老式顶点数组共享,因此我并不是专门针对VBO调用它。在许多方面,将数据发送到GPU(或使用GPU上已有的数据)与磁盘I / O和网络流量相似-如果您有几个大批量,则比许多小批量更高效。

一个很好的比喻(不是100%准确,但是足以帮助您理解这个想法),如果您是一位必须将50个人从一个城市带到另一个城市的巴士司机,则可以比较。您可以一次加载一次,然后进行50次单独的行程-glBegin / glEnd。另外,您也可以将全部50个人放在公共汽车上,然后进行一次旅行-这是与顶点数组或VBO批处理(在VBO情况下,这50个人已经在公共汽车上了;)。

不过,这是有代价的,这里的代价是您无法在需要时仅指定顶点数据。好吧,好的,您可以做到这一点(需要做一些额外的工作),但是您将无法从代码中获得全部性能。相反,您需要更多地考虑您的顶点数据,如何使用它,如何(以及是否)需要更新顶点,是否可以在着色器中进行任何动画处理(因此使数据保持静态-VBO确实需要着色器来处理顶点数据)。很多动画案例可以很好地发挥作用),或者是否需要在每个帧中重新指定顶点数据,如果需要,则需要有效的更新策略,等等。如果您不这样做,而只是执行幼稚的转换,则您放置的风险很高在很多工作中,最终结果实际上只会变慢!

当您初次遇到它时,可能看起来需要做很多工作,但实际上并非如此。一旦进入这种思维方式,您就会发现它非常简单,几乎是自然而然的。但是,您可能会加紧最初的尝试,如果这样的话,您不应该灰心-加紧是一个从您做错的事情中学到的机会。

最后的几点想法。

将模型数据的格式可以轻松地加载到VBO中,可以帮助您简化整个过程。这意味着您至少应首先避免使用更复杂或异常的格式(直到您对该过程更满意为止);在学习时,使事情尽可能简单和基本,并且如果出错(或何时!),出错的地方将会更少,并且寻找错误的地方也更少。

如果人们看到VBO实施使用的内存比优化/压缩的glBegin / glEnd实施要多(他们甚至将其称为“浪费”),则有时会感到不满。别那样 除了在极端情况下,内存使用实际上并不那么重要。这显然是一个折衷方案-您正在接受可能更高的内存使用量,以换取更高的性能。也有助于发展一种观念,即内存是一种可以使用的廉价大量资源;性能不是。

最后是旧栗子-如果速度已经足够快,那么您的工作就完成了。如果您要达到目标帧速率,并且有足够的瞬态条件余量,那么就足够了,您可以继续下一步。您可能会浪费大量时间和精力,从实际上不需要的东西中挤出额外的10%(在那里,这样做,仍然落入陷阱),因此请始终考虑自己最佳的时间使用方式是什么-因为程序员花费的时间甚至比性能还便宜!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.