我最近阅读了this列表,我注意到我从OpenGL Red Book中学到的几乎所有东西都被认为已被弃用。 我在谈论像素传输操作,像素图,累积缓冲区,开始/结束功能(!?),自动mipmap生成和当前光栅位置。
为什么他们将这些功能标记为已弃用?还可以使用它们吗?有哪些解决方法?
答案 0 :(得分:11)
在我看来它更好。但是这个所谓的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/
直截了当地试图忘记你目前所知道的,立即模式已经被弃用了,不应再使用了,而是专注于新技术;)
编辑 请原谅,如果我使用'中间'代替'立即',我认为它实际上称为'立即',我倾向于将它们混合起来。
答案 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
。