3

我最近阅读了这个列表,我注意到我从 OpenGL 红皮书中研究的几乎所有内容都被认为已弃用。我说的是像素传输操作、像素绘图、累积缓冲区、开始/结束函数(!?)、自动 mipmap 生成和当前光栅位置。

为什么他们将这些功能标记为已弃用?仍然可以使用它们吗?有哪些解决方法?

4

2 回答 2

12

在我看来,它是更好的。但是这个所谓Immediate Mode的在 OpenGL 3.0 中确实被弃用了,主要是因为它的性能不是最优的。

glBegin在即时模式下,您可以使用和之类的调用glEnd。所以图元的渲染依赖于程序的命令,OpenGL在从CPU得到适当的命令之前不能前进。相反,您可以使用缓冲区对象来存储所有顶点和数据。然后告诉 OpenGL 使用这个缓冲区来渲染它的图元,使用类似的命令,glDrawArrays甚至glDrawElements更专业的命令,如glDrawElementsInstanced. 当 GPU 忙于执行这些命令并将缓冲区绘制到目标FrameBuffer(基本上是渲染目标)时。该程序可以关闭并发出一些其他命令。这样 CPU 和 GPU 都会同时忙碌,不会浪费时间。

这不是最好的解释,但我的建议是:尝试学习这个新的渲染管道。到目前为止,它优于即时模式。我推荐以下教程:

http://www.arcsynthesis.org/gltut/index.html

http://www.opengl-tutorial.org/

http://ogldev.atspace.co.uk/

从字面上试着忘记你到目前为止所知道的,立即模式早已被弃用,不应该再使用,相反,专注于新技术;)

编辑 对不起,如果我使用“中间”而不是“立即”,我认为它实际上被称为“立即”,我倾向于将它们混淆。

于 2012-08-19T15:09:24.850 回答
9

为什么他们将这些功能标记为已弃用?

首先,一些术语:它们没有被弃用。在 OpenGL 3.0 中,它们已被弃用(意思是“可能在以后的版本中被删除”);在 3.1 及以上版本中,大部分都被删除了兼容性配置文件将删除的功能带回来。虽然它在 Windows 和 Linux 上广泛实施,但 Apple 的 3.2 实施只实施了核心配置文件。

至于删除背后的原因,这取决于您正在谈论的功能。我们真的只能推测为什么 ARB 有任何特定功能:

像素转移操作

像素传输操作没有被删除。如果您在谈论glDrawPixels,那是一个像素传输操作,但它是一个像素传输。不是所有的人。

说到这里:

像素图

因为一开始这是一个可怕的想法。glDrawPixels是一个性能陷阱;听起来不错,整洁,但性能很差,而且因为它很简单,所以人们会尝试使用它。

有一些容易做但性能很差的事情会鼓励人们编写糟糕的 OpenGL 应用程序。

累积缓冲器

着色器可以很好地做到这一点。事实上更好;他们有比累积缓冲区更多的选择。

开始/结束函数(!?),

这是另一个性能陷阱。即时模式渲染非常慢。

自动生成mipmap

因为一开始这是一个糟糕的主意。让 OpenGL 决定何时执行诸如生成纹理的 mipmap 之类的重量级操作并不是一个好主意。ARB 更好的想法是让你说,“好的,OpenGL,现在为这个纹理生成一些 mipmaps。”

当前光栅位置。

另一个性能陷阱/坏主意。

仍然可以使用它们吗?

随你(由你决定。NVIDIA 已有效地承诺永久支持兼容性配置文件。这意味着 AMD 和英特尔可能也必须这样做。这涵盖了 Windows 和 Linux。

在 MacOSX 上,Apple 更加严格地控制 GL 实现,而且他们似乎承诺支持兼容性配置文件。然而,他们似乎对推进 OpenGL 没什么兴趣,因为他们停止了 3.2。甚至 Mountain Lion 也没有更新 OpenGL 版本。

有哪些解决方法?

停止使用性能陷阱。像其他人一样为您的顶点数据使用缓冲区对象。使用着色器。使用glGenerateMipmap.

于 2012-08-19T15:23:39.957 回答