OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近 350 个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于 Microsoft Windows 上的 Direct3D。OpenGL 常用于 CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL 的高效实现(利用了图形加速硬件)存在于 Windows,部分 UNIX 平台和 Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库 Mesa 是一个纯基于软件的图形 API,它的代码兼容于 OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的 API。
OpenGL 规范由 1992 年成立的 OpenGL 架构评审委员会(ARB)维护。ARB 由一些对创建一个统一的、普遍可用的 API 特别感兴趣的公司组成。根据 OpenGL 官方网站,2002 年 6 月的 ARB 投票成员包括 3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI 和 Sun Microsystems,Microsoft 曾是创立成员之一,但已于 2003 年 3 月退出。
简介
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近 350 个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。而另一种程序接口系统是仅用于 Microsoft Windows 上的 Direct3D。OpenGL 常用于 CAD、虚拟实境、科学可视化程序和电子游戏开发。
OpenGL 的高效实现(利用了图形加速硬件)存在于 Windows,部分 UNIX 平台和 Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库 Mesa 是一个纯基于软件的图形 API,它的代码兼容于 OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的 API。
OpenGL 规范由 1992 年成立的 OpenGL 架构评审委员会(ARB)维护。ARB 由一些对创建一个统一的、普遍可用的 API 特别感兴趣的公司组成。根据 OpenGL 官方网站,2002 年 6 月的 ARB 投票成员包括 3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI 和 Sun Microsystems,Microsoft 曾是创立成员之一,但已于 2003 年 3 月退出。
设计
图形管线
OpenGL 规范描述了绘制 2D 和 3D 图形的抽象 API。尽管这些 API 可以完全通过软件实现,但它是为大部分或者全部使用硬件加速而设计的。
OpenGL 的 API 定义了若干可被客户端程序调用的函数,以及一些具名整型常量(例如,常量 GL_TEXTURE_2D 对应的十进制整数为 3553)。虽然这些函数的定义表面上类似于 C 编程语言,但它们是语言独立的。因此,OpenGL 有许多语言绑定,值得一提的包括:JavaScript 绑定的 WebGL(基于 OpenGL ES 2.0 在 Web 浏览器中的进行 3D 渲染的 API);C 绑定的 WGL、GLX 和 CGL;iOS 提供的 C 绑定;Android 提供的 Java 和 C 绑定。
OpenGL 不仅语言无关,而且平台无关。规范只字未提获得和管理 OpenGL 上下文相关的内容,而是将这些作为细节交给底层的窗口系统。出于同样的原因,OpenGL 纯粹专注于渲染,而不提供输入、音频以及窗口相关的 API。
OpenGL 是一个不断进化的 API。新版 OpenGL 规范会定期由 Khronos Group 发布,新版本通过扩展 API 来支持各种新功能。每个版本的细节由 Khronos Group 的成员一致决定,包括显卡厂商、操作系统设计人员以及类似 Mozilla 和谷歌的一般性技术公司。
除了核心 API 要求的功能之外,GPU 供应商可以通过扩展的形式提供额外功能。扩展可能会引入新功能和新常量,并且可能放松或取消现有的 OpenGL 函数的限制。然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动。供应商使用扩展公开自定义的 API 而无需获得其他供应商或 Khronos Group 的支持,这大大增加了 OpenGL 的灵活性。OpenGL Registry 负责所有扩展的收集和定义。
每个扩展都与一个简短的标识符关系,该标识符基于开发公司的名称。例如,英伟达(nVidia)的标识符是NV。如果多个供应商同意使用相同的 API 来实现相同的功能,那么就用 EXT 标志符。这种情况更进一步,Khronos Group 的架构评审委员(Architecture Review Board,ARB)正式批准该扩展,那么这就被称为一个“标准扩展”,标识符使用 ARB。第一个 ARB 扩展是 GL_ARB_multitexture。
OpenGL 每个新版本中引入的功能,特别是 ARB 和 EXT 类型的扩展,通常由数个被广泛实现的扩展功能组合而成。
文档
OpenGL 普及的部分原因是其高质量的官方文件。OpenGL 架构评审委员会随规范一同发布了一系列包含 API 变化更新的手册。这些手册因其封面颜色而众所周知。
红宝书
Dave Shreiner, Graham Sellers, John M. Kessenich and Bill M. Licea-Kane. 2013.OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3(8th Edition). Addison-Wesley Professional.ISBN 978-0321773036.
橙宝书
Randi J. Rost, Bill M. Licea-Kane, Dan Ginsburg, John M. Kessenich, Barthold Lichtenbelt, Hugh Malan and Mike Weiblen. 2009.OpenGL Shading Language (3rd Edition). Addison-Wesley Professional.ISBN 978-0321637635
相关程序库
早期的 OpenGL 版本会一同发布配套的 GLU 库,提供一些同时代硬件尚不支持的简单功能。GLU 最后一次更新规格要求是在 1998 年,对已弃用的 OpenGL 特性有依赖。
还有几个库也创建在 OpenGL 之上,提供了 OpenGL 本身没有的功能:
GLFW
GLUT
GLEW、GLEE
特别是,OpenGL Performer 库——由 SGI 开发并可以在 IRIX、Linux 和 Microsoft Windows 的一些版本上使用,构建于 OpenGL,可以创建实时可视化仿真程序。
当开发者需要使用最新的 OpenGL 扩展时,他们往往需要使用 GLEW 库或者是 GLEE 库提供的功能,可以在程序的运行期判断当前硬件是否支持相关的扩展,防止程序崩溃甚至造成硬件损坏。这类库利用动态加载技术(dlsym、GetProcAddress 等函数)搜索各种扩展的信息。
历史
1980 年代,开发可以用在各种各样图形硬件上的软件是个真正的挑战。通常,软件开发人员为每种硬件编写自定义的接口和驱动程序。但这非常昂贵并会导致大量工作的重复。
20 世纪 90 年代初,SGI 成为工作站 3D 图形领域的领导者。其 IRISGL 的 API 被认为是最先进的科技并成为事实上的行业标准,而基于开放标准的 PHIGS 则相形见绌。IRIS GL 更容易使用,而且还支持即时模式的渲染。相比之下,PHIGS 难于使用并且功能老旧。
SGI 的竞争对手(包括 Sun、惠普和 IBM)通过扩展 PHIGS 标准也能将 3D 硬件投入市场。这反过来导致 SGI 市场份额的削弱,因为有越来越多的 3D 图形硬件供应商进入市场。为攻占市场,SGI 决定把 IRIS GL API 转变为一项开放标准,即 OpenGL。
然而,SGI 拥有大量的软件客户,对他们来说从 IRIS GL 迁移到 OpenGL 将需要巨额投资。此外,IRIS GL 的应用程序接口拥有与 3D 图形不相关的函数。例如,它包括窗口、键盘和鼠标的 API,部分原因是由于它是在 X Window 系统和 Sun 公司的 NeWS 系统之前开发的。而且,IRIS GL 库由于授权和专利问题并不适合开放。上述种种因素要求 SGI 继续支持先进和专有的 IRIS Inventor 和 IRIS Performer 应用程序接口。
IRIS GL 的限制之一是只能访问由底层硬件支持的功能。如果图形硬件不支持一项功能,那么该应用程序将不能使用它。OpenGL 通过为硬件不具备的功能提供软件支持克服了此问题,这就允许应用程序在相对较弱的系统中使用先进的图形技术。OpenGL 标准化了访问硬件的方式:硬件接口程序的开发(有时也称为设备驱动程序)交由硬件制造商,而窗口功能委托给底层操作系统。让大量不同种类的图形硬件讲同一种语言影响深远,它为软件开发者进行 3D 软件发展提供了更高层次的平台。
1992 年,SGI 公司领导了 OpenGL 架构审查委员会(OpenGL ARB)的创建。该委员会由若干公司组成,负责未来 OpenGL 规范的维护和扩展。
微软在 1995 年发布 Direct3D,Direct 3D 最终成为 OpenGL 的主要竞争对手。1997 年 12 月 17 日,微软和 SGI 发起华氏温标项目,旨在统一 OpenGL 和 Direct3D 的接口。1998 年,惠普加入。后来,由于 SGI 的财政限制、微软的战略以及缺乏行业普遍支持,项目 1999 年遭弃。
2006 年 7 月,OpenGL 架构评审委员会投票决定将 OpenGL API 标准的控制权交给 Khronos Group。
绑定
为了加强它的多语言和多平台特性,已经用很多语言开发了 OpenGL 的各种绑定和移植。最值得注意的是,Java3D 库已经可以利用 OpenGL(另一个选择可能是 DirectX)作为它的硬件加速了。OpenGL 官方网页列出了用于 Java、Fortran 90、Perl、Pike、Python、Ada 和 Visual Basic 的多个绑定。
高级功能
OpenGL 被设计为只有输出的,所以它只提供渲染功能。核心 API 没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。然而,有些集成于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加 API 实现:
GLX- X11(包括透明的网上)
WGL-MicrosoftWindows
另外,GLUT 库能够以可移植的方式提供基本的窗口功能。
版本
OpenGL 进化自(而且风格很相似)SGI 的早期 3D 接口 IRIS GL。IRIS GL 的一个限制是它只能访问底层硬件提供的特性。如果图形硬件不支持例如纹理映射这样的功能,那么应用程序就不能使用它。OpenGL 通过在软件上对硬件不支持的特性提供支持的方法克服了这个问题,允许应用程序在相对低配置的系统上使用高级的图形特性。Fahrenheit 项目是 Microsoft 和 SGI 之间的联合行动,为了统一 OpenGL 和 Direct3D 接口的目的。它一开始提出了一些把规则带给交互 3D 计算机图形 API 世界的承诺,但因为 SGI 的财政限制,这个项目后来被放弃了。
2002 年微软的 DirectX 9 提出了全新的 Shader 绘图功能以及高端着色语言(HLSL),OpenGL 霸主地位开始被瓦解。这使得 3DLabs 了解到必须开发全新的 OpenGL 2.0 版本,但仅加入支持 GLSL 的功能。2006 年 Khronos 接手 OpenGL,立刻着手发展 Longs Peak 与 Mount Evans。2008 年推出 OpenGL 3,但评价普遍不高。
2010 年 3 月 10 日, OpenGL 同时推出了 3.3 和 4.0 版本,同年 7 月 26 日又发布了 4.1 版本。2011 年 8 月 8 日发布 4.2 版本。2013 年发布 4.3 版。