Legacy OpenGL
2008年,OpenGL 3.0 规范发布。在此版本中,固定功能管线(Fixed Function Pipeline)以及大多数相关的 OpenGL 函数和常量被标记为弃用(deprecated)。这些被弃用的元素和概念现在通常被称为旧版 OpenGL(Legacy OpenGL)。
旧版 OpenGL 仍然被某些支持核心 OpenGL 3.1 或更高版本以及 GL_ARB_compatibility 扩展的实现所支持。不暴露此扩展的实现仅提供其所基于的核心 OpenGL 规范中定义的功能。
注意
上述扩展与 OpenGL 3.2 引入的配置文件(profile)之间存在区别。有关详细信息,请参阅核心与兼容性上下文相关文档。
兼容性上下文的实现
- AMD 和 NVIDIA:在 Windows 和 Linux 上提供向后兼容的实现
- Apple:仅提供核心配置文件实现,Mac OSX 上支持到 OpenGL 3.2
- Intel:Windows 上 Sandy Bridge CPU 支持 OpenGL 3.1,Ivy Bridge CPU 支持 OpenGL 4.0;Linux 开源驱动开发者已表示不会在 Linux 上提供向后兼容性
识别旧版 OpenGL
以下是旧版 OpenGL 应用程序中的常见特征:
立即模式顶点属性指定
以 glBegin 开始、glEnd 结束的顶点属性指定是旧版 OpenGL 的典型标志。这种模式基于过程式方法,逐顶点、逐属性地提供顶点属性:
- 使用
glVertex*设置对象空间位置 - 使用
glColor*设置当前顶点颜色 - 使用
glNormal*设置当前法线方向
矩阵栈和矩阵操作
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(90.0, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0, -5.0);固定功能光照
旧版应用程序通常使用以下函数:
glLight*:设置特定光源的参数glLightModel:确定着色算法glMaterial:设置影响着色算法的材质属性
这些函数使用平面着色(flat shading)或 Gouraud 着色来粗略模拟现实世界的光照效果。
被移除的功能
OpenGL 3.0 规范附录 E 中列出了从核心 OpenGL 3.1 及更高版本中移除的所有功能。以下是受影响的重要领域:
- 固定功能顶点和片段处理:现在由开发者使用着色器完全编程
- 立即模式顶点属性指定和客户端顶点数组:顶点属性必须存储在缓冲区对象中,或使用
glVertexAttrib*()显式指定;OpenGL 3.2 起必须使用顶点数组对象(VAO) - 图元类型:
GL_QUAD和GL_POLYGON - 矩阵栈及相关矩阵操作函数:包括投影、模型视图和纹理矩阵
- 固定功能光照、材质和颜色材质:固定功能阴影映射和凹凸映射
- 累积缓冲区和辅助缓冲区:可使用帧缓冲区对象替代
- GLSL 版本:1.10 和 1.20
避免旧版 OpenGL 的理由
性能
使用顶点缓冲区对象(VBO),顶点属性数据可以一次传输到 GPU 并多次渲染。立即模式存在两个主要缺点:
- 产生大量 API 调用(如四个不同顶点属性需要四次调用)
- 即使是静态几何体,数据也需要每帧传输到 GPU
客户端顶点数组虽然减少了 CPU 开销,但在每次 glDrawArrays 或 glDrawElements 调用时仍需传输数据。VBO 将所有属性存储在 GPU 内存中,消除了这两个缺点。顶点数组对象(VAO)进一步减少了 API 调用次数。
着色器的灵活性
着色器提供了固定功能管线无法比拟的灵活性:
- 复杂光照模型:可实现逐像素 Phong 着色等高级效果
- 阴影映射:使用渲染到纹理方法,在着色器中直接进行计算
- 非真实感渲染:如卡通着色(toon shading)、赛璐珞着色(cel shading)
- 硬件几何实例化:OpenGL 3.1 引入核心,使用专用绘制调用和 GLSL 内置函数
- 动画:从简单变换到完整角色动画系统
兼容性
- OpenGL ES 2 和 3:不支持立即模式
- 跨平台:某些驱动可能不暴露兼容性扩展
- 未来保障:使用核心功能的应用程序符合所有后续版本
使用最新的 OpenGL 版本
重要提示
OpenGL 不是库,而是规范——就像 TCP/IP 不是库,而是定义通信协议的规范。
您应该始终使用最新的驱动程序版本。但 OpenGL 版本对应硬件功能层级:
- OpenGL 3.x:大致相当于 Direct3D 10 级别硬件
- OpenGL 4.x:大致相当于 Direct3D 11 级别硬件
使用 OpenGL 4.x 功能意味着您的程序只能在 4.x 硬件上运行。OpenGL 3.x 硬件已广泛可用,而 4.x 硬件也已普及多年。选择取决于您的需求。