跳轉至內容

X 視窗程式設計/OpenGL

來自 Wikibooks,開放世界中的開放書籍

OpenGLOpen Graphics Library)是一種標準規範,定義了跨語言、跨平臺的 API,用於編寫生成 3D 計算機圖形(以及 2D 計算機圖形)的應用程式。該介面包含 250 多個不同的函式呼叫,可用於從簡單的基元繪製複雜的 3D 場景。OpenGL 由矽谷圖形公司開發,在影片遊戲行業很受歡迎,它與微軟 Windows 平臺上的 Direct3D 競爭。OpenGL 被廣泛用於計算機輔助設計、虛擬現實、科學視覺化、資訊視覺化、飛行模擬和影片遊戲開發。

在最基本的層面上,OpenGL 是一個規範,這意味著它只是一個描述一組函式及其必須執行的精確行為的文件。從該規範中,硬體供應商建立了實現 - 為了匹配 OpenGL 規範中宣告的函式而建立的函式庫,儘可能地利用硬體加速。硬體供應商必須透過特定測試才能使其實現符合 OpenGL 實現的資格。

OpenGL 的高效供應商提供實現(在更大或更小的程度上利用圖形加速硬體)存在於 Mac OS、Microsoft Windows、Linux、許多 Unix 平臺、Wii 和 PlayStation 3 中。各種軟體實現存在,將 OpenGL 帶到各種沒有供應商支援的平臺。值得注意的是,開源庫 Mesa 是一個完全基於軟體的圖形 API,與 OpenGL 程式碼相容。但是為了避免與正式將其稱為 OpenGL 實現相關的許可費用,它聲稱僅僅是一個“非常類似的”API。

OpenGL 規範目前由 OpenGL 架構審查委員會 (ARB) 監督,該委員會成立於 1992 年。ARB 由一群對建立一致且廣泛可用的 API 有利害關係的公司組成。截至 2006 年 4 月,ARB 的投票成員包括 3D 硬體製造商矽谷圖形公司、3Dlabs、ATI Technologies、NVIDIA 和英特爾,以及計算機制造商 IBM、蘋果電腦、戴爾和太陽微系統。微軟是創始成員之一,於 2003 年 3 月離開。除了這些公司之外,每年還有許多其他公司被邀請以一年為期加入 OpenGL ARB。由於有如此多的公司參與其中,而且利益如此多樣,OpenGL 已經成為一個具有多種功能的通用 API。

根據當前計劃,OpenGL 的控制權將在 2006 年底移交給 Khronos Group。這樣做是為了改善 OpenGL 的營銷,並消除 OpenGL 和 OpenGL ES 開發之間的障礙。[1]

Kurt Akeley 和 Mark Segal 創作了最初的 OpenGL 規範。Chris Frazier 編輯了 1.1 版。Jon Leech 編輯了 1.2 到現在的 2.0 版。

OpenGL 具有兩個主要目的

  • 透過向程式設計師提供一個統一的 API,來隱藏與不同的 3D 加速器介面的複雜性。
  • 透過要求所有實現都支援完整的 OpenGL 功能集(必要時使用軟體模擬),來隱藏硬體平臺的不同功能。

OpenGL 的基本操作是接受點、線和多邊形等基元,並將它們轉換為畫素。這是透過稱為 OpenGL 狀態機的圖形管道來完成的。大多數 OpenGL 命令要麼將基元傳送到圖形管道,要麼配置管道如何處理這些基元。在引入 OpenGL 2.0 之前,管道的每個階段都執行固定函式,並且僅在嚴格的限制內可配置,但在 OpenGL 2.0 中,幾個階段可以使用 GLSL 完全程式設計。

OpenGL 是一個低階過程式 API,要求程式設計師指定渲染場景所需的精確步驟。這與描述性(也稱為場景圖或保留模式)API 形成對比,在描述性 API 中,程式設計師只需要描述一個場景,就可以讓庫管理渲染它的細節。OpenGL 的低階設計要求程式設計師對圖形管道有很好的瞭解,但也為實現新穎的渲染演算法提供了一定程度的自由。

歷史上,OpenGL 一直影響著 3D 加速器的開發,促進了現在消費級硬體中常見的基層功能。

  • 將光柵化的點、線和多邊形作為基本基元
  • 變換和照明管道
  • Z 緩衝
  • 紋理對映
  • Alpha 混合

許多現代 3D 加速器提供的功能遠遠超過此基線,但這些新功能通常是對此基本管道的增強,而不是對其進行徹底的改造。

我們首先清除顏色緩衝區,以便從一個空白畫布開始。

glClear( GL_COLOR_BUFFER_BIT );

現在我們設定模型檢視矩陣,它控制相機相對於我們渲染的基元的位置。我們將它沿 Z 軸向後移動 3 個單位,使其指向原點。

glMatrixMode( GL_MODELVIEW );       /* Subsequent matrix commands will affect the modelview matrix */
glLoadIdentity();                   /* Initialize the modelview to identity */
glTranslatef( 0, 0, -3 );           /* Translate the modelview 3 units along the Z axis */

投影矩陣控制應用於基元的透視效果,並且其控制方式類似於模型檢視矩陣。

glMatrixMode( GL_PROJECTION );      /* Subsequent matrix commands will affect the projection matrix */
glLoadIdentity();                   /* Initialize the projection matrix to identity */
glFrustum( -1, 1, -1, 1, 1, 1000 ); /* Apply a perspective-projection matrix */

最後,我們發出一個多邊形 - 一個位於 XY 平面上的綠色正方形。

glBegin( GL_POLYGON );              /* Begin issuing a polygon */
glColor3f( 0, 1, 0 );               /* Set the current color to green */
glVertex3f( -1, -1, 0 );            /* Issue a vertex */
glVertex3f( -1, 1, 0 );             /* Issue a vertex */
glVertex3f( 1, 1, 0 );              /* Issue a vertex */
glVertex3f( 1, -1, 0 );             /* Issue a vertex */
glEnd();                            /* Finish issuing the polygon */

OpenGL 的受歡迎程度部分歸功於其官方文件的出色表現。OpenGL ARB 隨著規範釋出了一系列手冊,這些手冊已經更新以跟蹤 API 的變化。這些手冊幾乎普遍以其封面的顏色而聞名。

  • 紅皮書 - OpenGL 程式設計師指南。 ISBN 0-321-33573-2
    一本可讀的教程和參考書 - 對於 OpenGL 程式設計師來說,這是一本“必備”書籍。
  • 藍皮書 - OpenGL 參考手冊。 ISBN 0-321-17383-X
    本質上是 OpenGL 的 手冊 頁面的硬複製。
    包括一個海報大小的摺疊圖,展示了理想化 OpenGL 實現的結構。
  • 綠皮書 - X 視窗系統 OpenGL 程式設計。 ISBN 0-201-48359-9
    一本關於 X11 介面和 GLUT 的書籍。
  • 阿爾法書(實際上封面是白色的) - Windows 95 和 Windows NT OpenGL 程式設計。 ISBN 0-201-40709-4
    一本關於將 OpenGL 與 Microsoft Windows 介面的書籍。

然後,對於 OpenGL 2.0 及更高版本

  • 橙皮書 - OpenGL 著色語言。 ISBN 0-321-33489-2
    一本可讀的 GLSL 教程和參考書。

擴充套件

[編輯 | 編輯原始碼]

OpenGL 標準允許各個供應商透過擴充套件來提供額外的功能,以應對新技術的出現。擴充套件可以引入新的函式和新的常量,並且可以放寬或移除對現有 OpenGL 函式的限制。每個供應商都有一個字母縮寫,用於命名其新的函式和常量。例如,英偉達的縮寫 (NV) 用於定義其專有的函式 glCombinerParameterfvNV() 和其常量 GL_NORMAL_MAP_NV。可能會出現多個供應商同意實現相同擴充套件功能的情況。在這種情況下,將使用縮寫EXT。此外,架構審查委員會可能會“認可”該擴充套件。然後,它將被稱為標準擴充套件,並且將使用縮寫ARB。第一個 ARB 擴充套件是 GL_ARB_multitexture,它是在 1.2.1 版中引入的。遵循官方擴充套件推廣路徑,多紋理不再是可選實現的 ARB 擴充套件,而是從 1.3 版開始成為 OpenGL 核心 API 的一部分。

在使用擴充套件之前,程式必須首先確定其可用性,然後獲取指向擴充套件定義的任何新函式的指標。執行此操作的機制是特定於平臺的,並且存在諸如 GLEW 和 GLEE 之類的庫來簡化此過程。

幾乎所有擴充套件的規範都可以在官方擴充套件登錄檔 [1] 中找到。

關聯的實用程式庫

[edit | edit source]

幾個庫建立在 OpenGL 之上或旁邊,以提供 OpenGL 本身不可用的功能。諸如 GLU 之類的庫總是可以與 OpenGL 實現一起找到,而其他一些庫,例如 GLUT 和 SDL,隨著時間的推移而發展,並提供基本的跨平臺視窗和滑鼠功能,如果不可用,則可以輕鬆下載並新增到開發環境中。簡單的圖形使用者介面功能可以在諸如 GLUI 或 FLTK 之類的庫中找到。其他一些庫,如 AUX,是已被更流行的庫中普遍可用的功能所取代的已棄用的庫,但程式碼仍然存在,特別是在簡單的教程中。其他庫是為了讓 OpenGL 應用程式開發人員能夠輕鬆地管理 OpenGL 擴充套件和版本控制而建立的,這些庫的例子包括 GLEW“The OpenGL Extension Wrangler Library”和 GLEE“The OpenGL Easy Extension library”。

除了上述簡單的庫之外,還存在其他更高階的面向物件的場景圖保留模式庫,例如 PLIB、OpenSG、OpenSceneGraph 和 OpenGL Performer,這些庫作為跨平臺的開源或專有程式設計介面提供,建立在 OpenGL 和系統庫之上,以使建立即時視覺模擬應用程式成為可能。

Mesa 3D ([2]) 是 OpenGL 的開源實現。它支援純軟體渲染,以及為 Linux 下的多個 3D 圖形卡提供硬體加速。截至 2006 年 2 月 2 日,它實現了 1.5 標準,併為一些平臺提供了它自己的擴充套件。

繫結

[edit | edit source]

為了強調其多語言和多平臺特性,已經為 OpenGL 在許多語言中開發了各種繫結和埠。最值得注意的是,Java 3D 庫可以依賴 OpenGL 來實現其硬體加速。直接繫結也可以使用,例如 Lightweight Java Game Library,它為 Java 和其他與遊戲相關的元件提供了 OpenGL 的直接繫結。最近,Sun 釋出了 JOGL 系統的測試版,該系統提供了對 C OpenGL 命令的直接繫結,與不提供這種低階支援的 Java 3D 不同。OpenGL 官方頁面 [3] 列出了 Java、Fortran 90、Perl、Pike、PythonAdaDelphi 和 Visual Basic 的各種繫結。繫結也適用於 C++C#,請參閱 [4]

更高階的功能

[edit | edit source]

OpenGL 被設計為僅用於圖形輸出:它僅提供渲染功能。核心 API 沒有視窗系統、音訊、螢幕列印、鍵盤/滑鼠或其他輸入裝置的概念。雖然這乍一看似乎很嚴格,但它允許執行渲染的程式碼完全獨立於它執行的作業系統,從而允許跨平臺開發。但是,需要與本機視窗系統整合,以允許與主機系統進行乾淨的互動。這是透過以下附加 API 完成的

  • GLX - X11(包括網路透明度)
  • WGL - Microsoft Windows

此外,GLUT 和 SDL 庫以可移植的方式提供了使用 OpenGL 進行基本視窗操作的功能。MacOS X 有三個 API 來獲取 OpenGL 支援:用於 Carbon 的 AGL、用於 Cocoa 的 NSOpenGL 以及用於低階訪問的 CGL。

歷史

[edit | edit source]

如今,三維動畫場景的數字生成已成為日常生活中的常見現象。科學家利用計算機圖形來分析各種可能的模擬。工程師和建築師使用計算機圖形設計虛擬模型。電影利用計算機圖形來創造驚人的特效或完整的動畫電影。在過去的幾年裡,電腦遊戲將計算機圖形技術帶給了普通消費者,使用圖形將玩家帶入到無法存在的現實世界中。

將數字圖形技術投入如此廣泛的應用並非沒有挑戰。十五年前,開發能夠與各種圖形硬體及其所有不同介面一起工作的軟體非常耗時。每個程式設計師團隊都分別開發了介面,因此產生了大量重複的程式碼。這阻礙了計算機圖形行業的發展。

到了 20 世紀 90 年代初,3D 圖形領域的領導者 SGI 及其程式設計 API IrisGL 已成為業界事實上的標準,超過了基於開放標準的 PHIGS。IrisGL 程式設計介面 (API) 優雅、易於使用,重要的是,它支援即時模式渲染。相比之下,PHIGS 笨拙、難以使用,並且在功能和能力方面落後於 IrisGL 好幾代,這主要是由於 PHIGS 標準化過程的低效。儘管如此,包括 Sun Microsystems、惠普和 IBM 在內的競爭供應商還是能夠推出可靠的 3D 硬體,並透過對 PHIGS 的專有擴充套件來支援它們。到了 90 年代初,3D 圖形硬體技術已被眾多競爭者所熟知,不再是計算機系統購買中的決定性因素。因此,SGI 試圖將事實上的標準轉變為真正的開放標準,而不是延長 IrisGL 和 PHIGS 之間有爭議且危險的鬥爭。

IrisGL API 本身不適合開放(儘管它以前已授權給 IBM 和其他人),部分原因是它多年來積累了大量雜亂無章的內容。例如,它包含一個視窗、鍵盤和滑鼠 API,部分原因是它是在 X11 視窗系統 與 Sun 的 NeWS 之間的鬥爭解決之前開發的。因此,需要清理要開放的 API。此外,IrisGL 擁有龐大的軟體供應商 (ISV) 投資組合;向 OpenGL API 的更改將使 ISV 被鎖定到 SGI(和 IBM)硬體上幾年,直到 OpenGL 的市場支援成熟。與此同時,SGI 將繼續嘗試透過推動更高層次的專有 Iris Inventor 和 Iris Performer 程式設計 API 來維持供應商鎖定。

結果被稱為OpenGL。OpenGL 標準化了對硬體的訪問,並將硬體介面程式(有時稱為裝置驅動程式)的開發責任推給了硬體製造商,並將視窗功能委託給了底層作業系統。由於存在如此多種不同的圖形硬體,因此讓它們以這種方式說同一種語言對軟體開發人員產生了非凡的影響,因為它為他們提供了更高階的 3D 軟體開發平臺。

1992 年,SGI 領導建立了 OpenGL 架構審查委員會 (OpenGL ARB),這是一個由多家公司組成的組織,負責在未來幾年維護和擴充套件 OpenGL 規範。OpenGL 發展自 (並且在風格上與) SGI 早期的 3D 介面 IrisGL 非常相似。IrisGL 的一個限制是,它只能訪問底層硬體支援的功能。如果圖形硬體不支援某個功能,那麼應用程式就無法使用它。OpenGL 透過在軟體中為硬體不支援的功能提供支援來克服這個問題,從而使應用程式能夠在效能相對較低的系統上使用高階圖形。

1994 年,SGI 玩弄了釋出名為 "OpenGL++" 的東西的想法,其中包含諸如場景圖 API (可能是基於其 Performer 技術) 之類的元素。該規範在一些感興趣的各方之間流傳 - 但從未變成產品。

1995 年,Direct3D 釋出後,微軟、SGI 和惠普發起了 Fahrenheit 專案,這是一個聯合專案,目標是統一 OpenGL 和 Direct3D 介面 - 並且再次新增場景圖 API。它最初顯示出了一些希望,可以給互動式 3D 計算機圖形 API 世界帶來秩序,但由於 SGI 的資金限制和行業普遍缺乏支援,該專案被放棄了。SGI 中的工程師們舉行了一個海灘派對來慶祝 - 他們用篝火燒掉了大量的 Fahrenheit 文件。

OpenGL 2.0

[編輯 | 編輯原始碼]

OpenGL 2.0 由 3Dlabs 構思,旨在解決人們對 OpenGL 停滯不前且缺乏明確方向的擔憂。3Dlabs 提出了對標準的一些重大補充,其中最重要的是 GLSL (OpenGL Shading Language,也稱為 slang)。這將使程式設計師能夠用類似於 C 的語言編寫的著色器替換 OpenGL 固定功能頂點和片段管道,從而大幅擴充套件了可能的圖形效果範圍。GLSL 值得注意的是,它對當時可用的硬體的限制做出了相對較少的讓步;這讓人想起早期 OpenGL 為 3D 加速器設定一個雄心勃勃的、面向未來的目標的傳統,而不僅僅是跟蹤當前可用硬體的狀態。最終的 OpenGL 2.0 規範 [5] 包含對 GLSL 的支援,但省略了許多最初提議的但被推遲到以後版本的 OpenGL 的其他功能 (儘管現在許多功能都可以作為擴充套件使用)。

OpenGL 2.1

[編輯 | 編輯原始碼]

OpenGL 2.1 於 2006 年 8 月 2 日釋出,與所有以前的 OpenGL 版本向後相容。OpenGL 2.1 包含以下功能

  • OpenGL 著色語言修訂版 1.20
  • 用於指定和查詢非正方形矩陣制服的命令,用於 OpenGL 著色語言
  • 畫素緩衝區物件,用於高效地將影像傳輸到緩衝區物件和從緩衝區物件傳輸到緩衝區物件,用於諸如以下命令glTexImage2DglReadPixels.
    此功能對應於ARB_pixel_buffer_object擴充套件。
  • sRGB 紋理格式。
    此功能對應於EXT_texture_sRGB擴充套件。

OpenGL 支援庫

[編輯 | 編輯原始碼]
  • GLUT - OpenGL 實用工具包。
  • GLU - OpenGL 程式的一些附加功能。
  • GLEW - OpenGL 擴充套件包裝庫。

參考文獻

[編輯 | 編輯原始碼]
  1. "OpenGL ARB to Pass Control of OpenGL Specification to Khronos Group". Press Releases. Khronos Group. July 31, 2006. Retrieved 2006-08-01.
華夏公益教科書