OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者“開放式圖形庫”),是用於渲染2D3D矢量圖形的跨語言跨平台應用程序編程接口(API)。這個接口由近350個不同的函數调用組成,用來從簡單的圖形位元繪製複雜的三維景象。而另一种程式介面系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用於CAD虛擬實境、科學視覺化程式和電子遊戲開發

OpenGL的高效實現(利用图形加速硬件)存在于Windows,部分UNIX平台和MacOS。這些實現一般由顯示裝置廠商提供,而且非常依賴於該廠商提供的硬體。開放原始碼函式庫Mesa是一個純基於軟體的圖形API,它的代码兼容於OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。

OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些對建立一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3DlabsApple ComputerATI TechnologiesDell ComputerEvans & SutherlandHewlett-PackardIBMIntelMatroxNVIDIASGISun MicrosystemsMicrosoft曾是创立成员之一,但已于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本身没有的功能:

特别是,OpenGL Performer库——由SGI开发并可以在IRIXLinuxMicrosoft Windows的一些版本上使用,构建于OpenGL,可以建立实时可视化仿真程序。

当开发者需要使用最新的OpenGL扩展时,他们往往需要使用GLEW庫或者是GLEE库提供的功能,可以在程序的运行期判断当前硬件是否支持相关的扩展,防止程序崩溃甚至造成硬件损坏。這類庫利用動態加載技術(dlsym、GetProcAddress等函數)搜尋各種擴展的信息。

OpenGL 上下文(英語:OpenGL context)的创建过程相当复杂,在不同的操作系统上也需要不同的做法。因此很多游戏开发和用户界面库都提供自动创建 OpenGL 上下文的功能,其中包括 SDLAllegroSFMLFLTKQt 等。也有一些库是专门用来创建OpenGL窗口的,其中最早的便是 GLUT,后被freeglut取代,比较新的也有GLFW可以使用。[2]

  • 以下套件可以用来创建并管理 OpenGL 窗口,也可以管理输入,但几乎没有除此以外的其它功能:
    • GLFW——跨平台窗口和键盘、鼠标、手柄处理;偏向游戏
    • freeglut——跨平台窗口和键盘、鼠标处理;API 是 GLUT API 的超集,同时也比 GLUT 更新、更稳定
    • GLUT——早期的窗口处理库,已不再维护
  • 支持创建 OpenGL 窗口的还有一些「多媒体库」,同时还支持输入、声音等类似游戏的程序所需要的功能:
    • Allegro 5——跨平台多媒体库,提供针对游戏开发的 C API
    • SDL——跨平台多媒体库,提供 C API
    • SFML——跨平台多媒体库,提供 C++ API;同时也提供 C#、Java、Haskell、Go 等语言的绑定
  • 窗口套件
    • FLTK——小型的跨平台 C++ 窗口组件库
    • Qt——跨平台 C++ 窗口组件库,提供许多OpenGL辅助对象
    • wxWidgets——跨平台 C++ 窗口组件库

在20世纪80年代,在没有跨平台库的情况下,开发能够兼容多种图形硬件的软件是一项挑战。软件开发者为每种硬件编写了自定义接口和驱动程序。这种做法成本高昂,导致工作量成倍增加。

20世紀90年代初,SGI成為工作站3D圖形領域的領導者。其IRIS GL的API被認為是最先進的科技並成為事實上的行業標準,而基於開放標準的PHIGS則相形見絀。IRIS GL更容易使用,而且還支持即時模式的渲染。相比之下,PHIGS難於使用並且功能老舊。

SGI的競爭對手(包括Sun惠普IBM)也能够推出受PHIGS标准扩展支持的三维硬件,這反過來導致SGI市場份額的削弱,因為有越來越多的3D圖形硬件供應商進入市場。爲攻佔市場,SGI決定把IRIS GL API轉變為一項開放標準,即OpenGL。

然而,SGI 拥有许多客户,从IRIS GL转向OpenGL对他们而言需要大量投资。此外,IRIS GL包含一些与三维图形无关的API函数。例如,它包含了窗口、键盘和鼠标 API,部分原因是由於它是在X Window系統和Sun公司的NeWS系統之前開發的。而且,IRIS GL库与SGI专有的图形硬件紧密绑定,由于硬件专利和商业秘密,无法直接开源。上述種種因素要求SGI繼續支持先進和專有的IRIS Inventor和IRIS Performer應用程序接口。

IRIS GL的一个限制是它仅提供底层硬件所支持的功能的访问权限。如果图形硬件不支持某项功能,则应用程序无法使用它。OpenGL通过为硬件不支持的功能提供软件实现克服了这一问题,使得应用程序能够在性能相对较低的系统上使用高级图形功能。OpenGL标准化了对硬件的访问方式,将硬件接口程序(设备驱动程序)的开发责任推给硬件制造商,并将窗口化功能委托给底层操作系统。面对如此多种类的图形硬件,让它们以这种方式“说同一种语言”产生了显著影响,为软件开发者提供了一个更高层次的三维软件开发平台。

1992年,SGI公司領導OpenGL架構審查委員會(OpenGL ARB)的創建。該委員會由若干公司組成,負責未來OpenGL規範的維護和擴充。

微軟在1995年發布Direct3D,Direct 3D最終成為OpenGL的主要競爭對手。1997年12月17日,微软和SGI启动了Fahrenheit項目,这是一项联合努力,旨在统一OpenGL和Direct3D接口(并添加场景图 API)。1998年,惠普加入。该项目最初显示出为交互式三维计算机图形 API 领域带来秩序的一些希望,但由于SGI的资金限制、Microsoft的战略考量以及行业支持的普遍缺乏,该项目于 1999 年被放弃。

2006年7月,OpenGL架构审查委员会投票决定将OpenGL API标准的控制权移交给Khronos Group。

OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念。雖然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允許跨平台開發。然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。这通过下列附加API實現:

另外,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版。

主要版本 发布日期 重要变更
1.1 1997年1月
1.2 1998年3月16日
1.2.1 1998年10月14日
1.3 2001年8月14日
1.4 2002年7月24日
1.5 2003年7月29日
2.0 2004年9月7日
2.1 2006年7月2日
3.0 2008年8月11日
3.1 2009年3月24日
3.2 2009年8月3日
3.3 2010年3月11日 OpenGL 3.3与4.0版一起发布。 以体现硬件支持Direct3D 10的可能性。
4.0 2010年3月11日 OpenGL 4.0与版本3.3一起发布。 它是为硬件设计的,以体现硬件支持Direct3D 11的可能性。

与OpenGL 3.0一样,这个版本的OpenGL包含大量相当无关紧要的扩展,旨在彻底揭示Direct3D 11级硬件的能力。

4.1 2010年7月26日
4.2 2011年8月8日 支持的显卡:NVIDIA GeForce 400系列以上,AMD Radeon HD7000系列以上,Intel HD Graphics (第7代Ivy Bridge系列以上)

AMD Radeon HD 6000 Series, AMD Radeon HD 7000 Series

  • 支持Shaders原子计数器和加载/存储/原子读-修改-写操作的单级纹理着色器。
  • 捕捉GPU-tessellated几何变换反馈的结果绘制的多个实例,使复杂的对象进行有效的重新定位和复制。
  • 支持修改任意子集的压缩纹理,而无需重新下载整个GPU的纹理,显著的性能改进。
  • 支持包装成一个单一的32位值显著降低内存存储和带宽的高效着色处理多个8位和16位值。
4.3 2012年8月6日 支持的显卡:NVIDIA GeForce 400系列以上,AMD Radeon HD5000系列以上,Intel HD Graphics (第7.5代Haswell系列以上)
  • 圍內充分利用GPU的並行計算着色器的圖形管道
  • 暗器的存儲緩衝區對象
  • 紋理參數查詢
  • 作為標準功能的高品質的紋理壓縮ETC2/EAC
  • 完全兼容的OpenGL ES3.0的API
  • 在應用程序開發過程中調試能力接收調試消息
  • 沒有數據複製以不同的方式解釋紋理的紋理意見
  • 增加了內存的安全性
  • 一個多應用的健壯性擴展
4.4 2013年7月22日[3] 支持的顯示卡:NVIDIA GeForce 400系列以上,AMD Radeon HD5000系列以上,Intel HD Graphics (第7.5代Haswell系列以上)
  • 緩衝區位置控制
  • 高效異步查詢
  • 着色器可變佈局
  • 高效多對象綁定
  • 精簡化Direct3D應用的移植
  • 非綁定的紋理擴展
  • 稀疏紋理擴展
4.5 2014年8月11日[4] 支持的显卡:NVIDIA GeForce 400系列以上,AMD Radeon HD7000系列以上,Intel HD Graphics (第8代Broadwell系列以上),Tegra K1Tegra X1
  • 直接状态访问(DSA) - 对象访问器使查询和修改状态不会将对象绑定到上下文中,从而提高应用程序和中间件的效率和灵活性
  • 刷新控制 - 应用程序可以在上下文切换之前控制挂起命令的刷新,实现高性能多线程应用程序
  • 鲁棒性 - 为WebGL浏览器等应用程序提供安全平台,包括阻止GPU复位影响任何其他正在运行的应用程序
  • OpenGL ES 3.1 API和着色器兼容性 - 可轻松开发和执行桌面系统上最新的OpenGL ES应用程序
4.6 2017年7月31日 支持的显卡:NVIDIA GeForce 400系列以上(理论上可支持)