我最近一直在寻找一本OpenGL书籍,并注意到OpenGL编程指南(2010)已被弃用.2.x的OpenGL 3.x有什么不同?
小智 30
在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更通用.一个例子是删除gl..Pointer调用glVertexPointer
,赞成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的第一步; 无论是在可用性还是在我们所处的时间内反映硬件.