OpenGL 3.x有什么不同?

时间:2010-08-16 11:40:08

标签: opengl

我最近一直在寻找一本OpenGL书,并注意到OpenGL编程指南(2010)已被弃用。从2.x开始,OpenGL 3.x有什么不同?

2 个答案:

答案 0 :(得分:29)

编辑:重大变化,以及一些更好的论据,包括我自己很长一段时间。还有更多要点和更短。

在OpenGL 3.0之前,没有办法选择特定的OpenGL版本。您始终拥有驱动程序和图形适配器功能支持的最高版本。这意味着新的核心功能必须与以前版本的旧功能兼容,否则旧应用程序在以后的OpenGL版本上运行时会中断。无法对以前版本执行更改的副作用是OpenGL慢慢开始遭受功能蠕变的影响。增加了功能而不是增强已经存在的功能。如果你看一下OpenGL 2.1,那么不同的绘制调用数量就是一个很好的例子。

OpenGL 3.0中引入的新上下文创建调用最终允许您为上下文选择特定的OpenGL版本,以及是否要使用已弃用的功能。 这意味着OpenGL最终可以修改旧的核心功能,这意味着不仅仅是“删除功能”,我看到有人将其用作更改的反驳参数。它还意味着在不删除它们的情况下改变函数的语义。一个例子是使glGen ..函数成为生成对象名称的必需函数,并使着色器和顶点数组对象成为必需的。 (后者在OpenGL 3.3中已弃用,未强制执行)。

现在可以实现这一目标,14年的蠕变和糟糕的设计决策最终可以得到纠正。当OpenGL 1.1于1996年推出时,有意义的是现在在2010年并不一定有意义。在今天的硬件上不是最佳的旧功能被删除,并且一些被删除以使API更通用。这方面的一个例子就是删除像glVertexPointer这样的gl..Pointer调用,而不是glVertexAttribPointer。 OpenGL 3.x最终没有将着色器数据标记为“this”和“that”;你决定。还对现有功能进行了修改,因此它们与先前版本的语义不同。通过删除默认着色器程序0强制着色器,该程序用于表示“着色器已禁用/使用固定功能”。由于在绑定了无效的着色器程序时,像glDrawElements这样的绘制调用会返回GL_INVALID_OPERATION,因此您实际上必须先成为着色器。

但是一切都无法在一夜之间改变,所以OpenGL 3.x引入了弃用模型。在以后的版本中删除功能之前,不推荐使用至少一个版本的功能。已移除的功能已移至名为GL_ARB_compatibility的OpenGL扩展中。您可以通过创建兼容性配置文件来打开此功能,而不是核心配置文件。这是新上下文创建调用中的标志,可从OpenGL 3.1及更高版本(不在3.0中)接受。可以通过制作向前兼容的上下文来强制执行不推荐的功能。同样,这是一个上下文创建标志。

总而言之,OpenGL 3.x是能够选择特定OpenGL版本并破坏与先前版本的兼容性以增强API的第一步;无论是在可用性还是在我们所处的时间内反映硬件。

答案 1 :(得分:3)

实际上很多事情。立即模式已弃用。要获得OpenGL 3.0功能,您现在应该明确地创建OpenGL 3.0上下文(现有的OpenGL 2.0程序不会这样做,因此它们获得2.0兼容的上下文)。 API也已扩展(详见http://www.opengl.org)。