OpenGL

**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 和 Google 的一般性科技公司。

除了核心 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++ 窗口組件庫

## 歷史

1980 年代，開發可以用在各種各樣圖形硬體上的軟體是個真正的挑戰。通常，軟體開發人員為每種硬體編寫自訂的介面和驅動程式。但這非常昂貴並會導致大量工作的重複。

20 世紀 90 年代初，SGI 成為工作站 3D 圖形領域的領導者。其 IRIS GL 的 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 被設計為只有輸出的，所以它只提供彩現功能。核心 API 沒有視窗系統、音訊、列印、鍵盤／滑鼠或其他輸入裝置的概念。雖然這一開始看起來像是一種限制，但它允許進行彩現的代碼完全獨立於他執行的作業系統，允許跨平台開發。然而，有些整合於原生視窗系統的東西需要允許和宿主系統互動。這通過下列附加 API 實現：

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

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

## 參見

* Khronos Group
* OpenGL ES

## 參考文獻

## 外部連結

* OpenGL 官方網站（頁面存檔備份，存於網際網路檔案館）
* Khronos Group 官方網站（頁面存檔備份，存於網際網路檔案館）