OpenGL的高效实现 OpenGL是什么

OpenGL(英语:Open Graphics Library , 译名:开放图形库或者“开放式图形库”)是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API) 。这个接口由近 350 个不同的函数调用组成 , 用来绘制从简单的图形比特到复杂的三维景象 。而另一种程序接口系统是仅用于 Microsoft Windows 上的 Direct3D 。OpenGL 常用于 CAD、虚拟现实、科学可视化程序和电子游戏开发 。

OpenGL的高效实现 OpenGL是什么

文章插图
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 等函数)搜索各种扩展的信息 。
历史【OpenGL的高效实现 OpenGL是什么】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 版 。