1. OpenGL历史版本
| 年 份 | 版本号 | 关键特性引入 |
|---|---|---|
| 1992 | 1.0 | 基础固定管线,立即模式 |
| 1995 | 1.1 | 顶点数组,纹理对象 |
| 1998 | 1.2 | 3D纹理,BGRA格式 |
| 2001 | 1.3 | 压缩纹理,多重纹理 |
| 2002 | 1.4 | 自动mipmap,深度纹理 |
| 2003 | 1.5 | VBO(顶点缓冲对象) |
| 2004 | 2.0 | GLSL着色器(革命性!) |
| 2006 | 2.1 | PBO(像素缓冲对象) |
| 2008 | 3.0 | FBO,VAO,废弃立即模式 |
| 2009 | 3.1 | 实例化渲染,统一缓冲 |
| 2009 | 3.2 | 几何着色器,核心/兼容配置 |
| 2010 | 3.3 | 计时查询,属性除数 |
| 2010 | 4.0 | 细分曲面,变换反馈增强 |
| 2011 | 4.1 | 独立着色对象,视口数组 |
| 2011 | 4.2 | 着色器原子操作 |
| 2012 | 4.3 | 计算着色器,调试输出 |
| 2013 | 4.4 | 缓冲放置,高效更新 |
| 2014 | 4.5 | DSA(直接状态访问) |
| 2017 | 4.6 | SPIR-V,多边形偏移钳制 |
OpenGL 1.5版本增加了缓冲区对象 VBO
OpenGL 2.1 加入了在缓冲区对象中存储像素数据(例如,纹理贴图或像素块)的支持
OpenGL 3.1 增加了统一缓冲对象(uniform buffer object)
OpenGL 3.0 增加顶点数组对象 VAO
2. OpenGL版本的决定因素
优先级排序
- 显卡硬件能力(物理上限)
- 显卡驱动版本(实际暴露的能力)
- 操作系统限制(特别是macOS)
- 运行时环境(容器、虚拟机、云主机)
- 应用程序请求(上下文创建参数)
对于大多数现代系统(2012年后的硬件),OpenGL版本主要受驱动版本影响。保持驱动更新是获得最佳OpenGL支持的关键。
3. 驱动模拟硬件功能
cpp
// Windows的opengl32.dll是一个经典例子
class WindowsOpenGLEmulation {
void windowsGLEmulation() {
// Windows默认只提供OpenGL 1.1
// 但通过ICD机制支持高级版本
// 架构:
// App → opengl32.dll → 厂商ICD → GPU
// opengl32.dll的责任:
// 1. 提供OpenGL 1.1的软件实现
// 2. 加载厂商ICD(如果存在)
// 3. 转发函数调用
// 如果没有安装厂商驱动:
// opengl32.dll使用微软的软件渲染器
// 最多支持OpenGL 1.1(很慢)
// 如果安装了NVIDIA/AMD驱动:
// opengl32.dll将调用转发到厂商ICD
// 支持完整OpenGL 4.6
}
};
- 更新驱动可以获得"免费的性能和功能升级",即使硬件不变
- 不同的驱动可能对同一硬件提供不同的OpenGL版本支持
- "支持的OpenGL版本"不等于"硬件原生能力"
- 有些驱动模拟很高效,有些则性能代价很大
- 作为开发者,需要同时考虑硬件能力和驱动能力
- 这就是为什么保持驱动更新如此重要------你不仅获得bug修复,还可能获得新的模拟特性,让老硬件支持新API,或者让现有特性运行更快。