不推荐的OpenGL功能

时间:2012-08-19 14:50:50

标签: c++ windows opengl deprecated

我最近阅读了this列表,我注意到我从OpenGL Red Book中学到的几乎所有东西都被认为已被弃用。 我在谈论像素传输操作,像素图,累积缓冲区,开始/结束功能(!?),自动mipmap生成和当前光栅位置。

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

2 个答案:

答案 0 :(得分:11)

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

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

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

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

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

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

直截了当地试图忘记你目前所知道的,立即模式已经被弃用了,不应再使用了,而是专注于新技术;)

编辑 请原谅,如果我使用'中间'代替'立即',我认为它实际上称为'立即',我倾向于将它们混合起来。

答案 1 :(得分:9)

  

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

首先,一些术语:它们不是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