OpenGL

OpenGL（Open Graphics Library，譯名：開放圖形庫或者「開放式圖形庫」），是用於渲染2D、3D矢量圖形的跨語言、跨平台的應用程序編程接口（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投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems，Microsoft曾是創立成員之一，但已於2003年3月退出。

## 設計

<image>

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 context）的創建過程相當複雜，在不同的作業系統上也需要不同的做法。因此很多遊戲開發和使用者界面庫都提供自動創建 OpenGL 上下文的功能，其中包括 SDL、Allegro、SFML、FLTK、Qt 等。也有一些庫是專門用來創建OpenGL窗口的，其中最早的便是 GLUT，後被freeglut取代，比較新的也有GLFW可以使用。

- 以下套件可以用來創建並管理 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實現：

- GLX - X11（包括透明的網路）
- WGL - Microsoft Windows

另外，GLUT庫能夠以可移植的方式提供基本的視窗功能。

## 版本

OpenGL進化自（而且風格很相似）SGI的早期3D接口IRIS GL。IRIS GL的一個限制是它只能訪問底層硬體提供的特性。如果圖形硬體不支持例如紋理映射這樣的功能，那麼應用程式就不能使用它。OpenGL通過在軟體上對硬體不支持的特性提供支持的方法克服了這個問題，允許應用程式在相對低配置的系統上使用高級的圖形特性。Fahrenheit圖形API項目是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日｜支持的顯示卡：NVIDIA GeForce 400系列以上，AMD Radeon HD5000系列以上，Intel HD Graphics （第7.5代Haswell系列以上）、緩衝區位置控制、高效異步查詢、著色器可變佈局、高效多對象綁定、精簡化Direct3D應用的移植、非綁定的紋理擴展、稀疏紋理擴展

4.5｜2014年8月11日｜支持的顯卡：NVIDIA GeForce 400系列以上，AMD Radeon HD7000系列以上，Intel HD Graphics （第8代Broadwell系列以上），Tegra K1，Tegra X1、直接狀態訪問（DSA） - 對象訪問器使查詢和修改狀態不會將對象綁定到上下文中，從而提高應用程式和中間件的效率和靈活性、刷新控制 - 應用程式可以在上下文切換之前控制掛起命令的刷新，實現高性能多線程應用程式、魯棒性 - 為WebGL瀏覽器等應用程式提供安全平台，包括阻止GPU復位影響任何其他正在運行的應用程式、OpenGL ES 3.1 API和著色器兼容性 - 可輕鬆開發和執行桌面系統上最新的OpenGL ES應用程式

4.6｜2017年7月31日｜支持的顯卡：NVIDIA GeForce 400系列以上（理論上可支持）、SPIR-V著色器、各向異性過濾

## 基本資料

- 作者：矽谷圖形公司
- 開發者：Khronos Group
- 發行日期：1992年6月30日
- 軟體版本週期：4.6
- 軟體版本週期：2017年7月31日
- 程式語言：C語言
- 作業系統：跨平台
- 類型：應用程序接口
- 許可協議：多種