我最近阅读了这个列表,我注意到我从 OpenGL 红皮书中研究的几乎所有内容都被认为已弃用。我说的是像素传输操作、像素绘图、累积缓冲区、开始/结束函数(!?)、自动 mipmap 生成和当前光栅位置。
为什么他们将这些功能标记为已弃用?仍然可以使用它们吗?有哪些解决方法?
我最近阅读了这个列表,我注意到我从 OpenGL 红皮书中研究的几乎所有内容都被认为已弃用。我说的是像素传输操作、像素绘图、累积缓冲区、开始/结束函数(!?)、自动 mipmap 生成和当前光栅位置。
为什么他们将这些功能标记为已弃用?仍然可以使用它们吗?有哪些解决方法?
在我看来,它是更好的。但是这个所谓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/
从字面上试着忘记你到目前为止所知道的,立即模式早已被弃用,不应该再使用,相反,专注于新技术;)
编辑 对不起,如果我使用“中间”而不是“立即”,我认为它实际上被称为“立即”,我倾向于将它们混淆。
为什么他们将这些功能标记为已弃用?
首先,一些术语:它们没有被弃用。在 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
.