OpenGL
OpenGL是用于渲染2D和3D矢量图形的跨语言、跨平台应用程序编程接口(API)规范,其名称来自英语开放图形库(Open Graphics Library)。该规范以渲染管线的形式定义了应用程序如何调用图形硬件完成绘图,并不规定具体实现方式,实现工作由显卡厂商在驱动程序中完成。它诞生于1992年,现由Khronos Group维护,长期用于计算机辅助设计、虚拟现实、科学可视化和电子游戏开发等领域。
定义
OpenGL是一份以文字形式发布的接口规范,规定了一组可供应用程序调用的绘图函数、若干具名整型常量,以及调用这些函数后图形系统应有的行为[1]。规范本身给的是抽象接口,程序用什么语言写、驱动怎么实现,都不在其约束范围内,因此它有很多语言绑定,较常见的有 C 语言的绑定,以及基于 OpenGL ES 在浏览器中作图的 WebGL[2]。
规范只负责渲染,不涉及窗口创建、键盘鼠标输入和音频;获取与管理绘图上下文这件事留给底层的窗口系统处理,这是它能够跨平台的原因之一[2]。接口设计上以图形硬件加速为目标,函数被要求尽量由硬件执行,不具备相应硬件能力的功能则由驱动以软件方式补足[3]。
原理
从程序角度看,OpenGL是一台状态机:调用绘图命令之前要先设置各种状态(例如当前的颜色、纹理、混合方式、深度测试开关),之后的绘制命令再按这些状态处理数据;状态中大部分彼此独立,不产生意外的连带影响[4]。早期版本采用固定功能管线,只能使用硬件预设好的运算;2002 年前后引入可编程着色器管线,开发者用类 C 的 OpenGL 着色语言(GLSL)编写顶点着色器和片元着色器,由 GPU 执行,自行决定顶点位置与像素颜色[3]。
一次典型的绘制流程是:创建渲染上下文、准备缓冲对象与着色器程序等资源、设置状态并发出绘制命令,最后交换前后缓冲把结果显示到屏幕上[5]。4.x 版本的管线还包括细分着色器与几何着色器,用于在 GPU 上增加图元,4.3 版本起提供计算着色器[5]。
发展历程
20 世纪 80 年代,3D 图形逐渐普及,但各家工作站厂商各有自己的图形接口,互不兼容,这类分裂局面拖慢了图形应用的推广[6]。Silicon Graphics(SGI)的 IRIS GL 成为事实上的行业标准,却也只提供底层硬件已经支持的功能;1991 年 9 月,SGI 决定将该图形库开放授权,随后将其改造为公开标准[7]。OpenGL 1.0 规范由 Mark Segal 与 Kurt Akeley 完成,于 1992 年 6 月 30 日发布[7][8]。
1992 年 SGI 主导成立了 OpenGL 架构评审委员会(OpenGL ARB),由多家公司共同维护和扩展规范,成员各有一票,负责制定一致性测试并批准新特性[6]。1996 年微软发布 Direct3D,此后长期是 OpenGL 的主要竞争对手[9]。2006 年 7 月,ARB 表决通过把 OpenGL 标准的控制权移交Khronos Group,即一个制定开放标准的行业联盟[9]。
2004 年发布的 OpenGL 2.0 把着色语言纳入核心,同时支持固定功能与可编程两条路径;2009 年前后,3.2 版本引入核心模式与兼容模式两种配置,核心模式剔除过时的旧特性,兼容模式保留旧接口[3]。2010 年 3 月 11 日,Khronos 发布 4.0 规范,增加细分着色器等特性,并同期发布 3.3 以便上一代显卡获得相近功能[10]。目前最新的 4.6 规范与 GLSL 4.60 规范于 2017 年 7 月 31 日发布[11]。
应用
OpenGL的应用范围包括计算机辅助设计、内容创作、能源、娱乐、游戏开发、制造业、医疗和虚拟现实等,面向个人电脑、工作站与超级计算机等硬件平台[12]。桌面操作系统上的高效实现一般由显卡厂商随驱动提供,并高度依赖具体硬件[2]。
在主接口之外,还存在若干变体与配套标准:面向手机和嵌入式设备的裁剪版本 OpenGL ES,以及基于 OpenGL ES 2.0、在浏览器中无需插件即可渲染 3D 内容的 WebGL[12]。创建窗口和绘图上下文的工作常交由第三方库完成,例如 GLFW、freeglut 以及 SDL、Qt 等多媒体或界面库[2]。
局限
作为规范,OpenGL规定的是行为与结果,而不是像素级一致的输出,不同驱动实现的画面可能略有差别;同时它把上下文管理、多线程调度等责任留给应用与平台,程序需要自己处理这些环节[4]。扩展机制虽让新硬件特性得以先行使用,但也造成不同显卡、不同驱动支持的扩展集合不一致,给需要稳定运行的商业软件带来适配负担;由委员会讨论决定的流程也使通用特性的引入偏慢[4]。
苹果在 2018 年的开发者大会上宣布,macOS 10.14 与 iOS 12 起将 OpenGL 与 OpenGL ES 列为已弃用技术,建议新项目改用其自有的 Metal;其理由是 OpenGL 的设计始于 25 年前,而 GPU 管线、多线程与异步计算方式都已改变[13]。苹果平台上的 OpenGL 长期停留在 4.1 版本,未跟进后续版本[14]。在 Khronos 一侧,后续的低开销跨平台接口 Vulkan 被视为 OpenGL 的继任者,新版本 OpenGL 的开发不再是重点[15]。
参见
参考资料
- glspec45.compatibility.withchanges(PDF) [引用日期2026-10-29]
- OpenGL [引用日期2026-10-29]
- OpenGL Evolution & JOGL [引用日期2026-10-29]
- Real-Time Rendering [引用日期2026-10-29]
- 北京邮电大学 & Khronos北京分会活动 [引用日期2026-10-29]
- Standards and certifications at SGI [引用日期2026-10-29]
- K H R O N O S [引用日期2026-10-29]
- OpenGL [引用日期2026-10-29]
- OpenGL [引用日期2026-10-29]
- khronos.org 上的网页 [引用日期2026-10-29]
- opengl.org 上的网页 [引用日期2026-10-29]
- open graphics library site:www.khronos.org at DuckDuckGo [引用日期2026-10-29]
- gamesbeat.com 上的网页 [引用日期2026-10-29]
- geeks3d.com 上的网页 [引用日期2026-10-29]
- Teaching native graphics in 2023 [引用日期2026-10-29]