已弃用的 OpenGL 功能

Posted

技术标签:

【中文标题】已弃用的 OpenGL 功能【英文标题】:Deprecated OpenGL features 【发布时间】:2012-08-19 14:50:49 【问题描述】:

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

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

【问题讨论】:

gamedev.stackexchange.com 上至少已经回答了有关即时模式(“开始/结束功能”)的部分:Why does OpenGL >= 3 only allow VBOs? 开始学习现代 OpenGL 的最简单方法是进入 OpenGL ES 2.0。在那里,他们实际上删除了这些已弃用的函数,并迫使您使用更现代的 API。 欢迎来到软件开发的世界。我在 1980 年学到的关于 Zilog Z80 和 CP/M 的一切在第一台 PC 到来时都毫无用处。所以我们不得不学习 8088 和 PC-DOS。这对 16 位 Windows 无用,对 32 位 Windows 等无用。这就是它的工作方式;继续学习吧! 我不打算为嵌入式系统编码,所以 OpenGL ES 无济于事。 它不被视为已弃用。它已删除。有区别。 【参考方案1】:

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

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

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

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

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

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

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

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

【讨论】:

你最推荐哪本书? 第一个链接(arcsynthesis)让我开始使用 OpenGL 3.0+,注意它还没有完全完成,但我还没有遇到更好的书。其他两个链接只是有一些关于特定主题的简短教程(特别是第三个链接,它有一些关于高级主题的教程,如阴影贴图甚至延迟着色)。【参考方案2】:

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

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

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

像素转移操作

Pixel transfer operations未被删除。如果您在谈论glDrawPixels,那是一个像素传输操作,但它是一个 像素传输。不是全部。

说到这里:

像素图

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

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

累积缓冲区

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

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

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

自动生成mipmap

因为一开始这是一个糟糕的主意。让 OpenGL 决定何时执行诸如生成纹理的 mipmap 之类的重量级操作并不是一个好主意。 ARB 的更好的想法是让你说,"OK, OpenGL, generate some mipmaps for this texture right now."

当前光栅位置。

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

还能继续使用吗?

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

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

有什么解决方法?

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

【讨论】:

我想指出,一旦你习惯了使用现代 OpenGL,你就再也不想回去了。一旦您体验了片段着色器的易用性,即使是简单的事情,您再也不想碰glTexEnv。一旦你使用顶点着色器生成纹理坐标,你就再也不想碰glTexGen了。即时模式和显示列表使用起来很麻烦,并且给人一种使用场景图的错误感觉。 OpenGL 矩阵堆栈总是缺少你需要的一个函数,所以你还是自己实现了整个矩阵的东西。

以上是关于已弃用的 OpenGL 功能的主要内容,如果未能解决你的问题,请参考以下文章

可能不支持 OpenGL 的“弃用”功能吗?

macOS 上的 OpenGL 是不是已弃用?

gluTess* 函数是不是已弃用?

OpenGL 纹理在 3.3 中都是黑色的 - 但在 3.1 中有效

ConnectivityManager.TYPE_WIFI 在代码中显示已弃用。我在 M 以上版本中使用了网络功能,想要删除已弃用的警告

Open GL 和 GLUT 在 10.9 中已弃用