複製鏈接
請複製以下鏈接發送給好友

OpenGL

鎖定
OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者“開放式圖形庫”)是用於渲染2D、3D矢量圖形的跨語言、跨平台的應用程序編程接口(API)。這個接口由近350個不同的函數調用組成,用來繪製從簡單的圖形到比較複雜的三維景象。而另一種程序接口系統是僅用於Microsoft Windows上的Direct3D。OpenGL常用於CAD、虛擬現實、科學可視化程序和電子遊戲開發。
OpenGL的高效實現(利用了圖形加速硬件)存在於Windows,部分UNIX平台和Mac OS。這些實現一般由顯示設備廠商提供,而且非常依賴於該廠商提供的硬件。開放源代碼庫Mesa是一個純基於軟件的圖形API,它的代碼兼容於OpenGL。但是,由於許可證的原因,它只聲稱是一個“非常相似”的API。
當今,OpenGL是視頻行業領域中用於處理2D/3D圖形的最為廣泛接納的API,在此基礎上,為了用於計算機視覺技術的研究,從而催生了各種計算機平台上的應用功能以及設備上的許多應用程序。其是獨立於視窗操作系統以及操作系統平台,可以進行多種不同領域的開發和內容創作,簡而言之,其幫助研發人員能夠實現PC、工作站、超級計算機以及各種工控機等硬件設備上實現高性能、對於視覺要求極高的高視覺圖形處理軟件的開發。 [2] 
中文名
開放圖形庫(英文Open Graphics Library的縮寫)
外文名
Open Graphics Library
平    台
Windows、類Unix、Linux、MacOS
是否開源
最近更新日期
2018-07-30
軟件類別
開放庫文件
介    紹
三維圖形處理庫,屬於工業標準

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、MatroxNVIDIASGISun Microsystems,Microsoft曾是創立成員之一,但已於2003年3月退出。

OpenGL功能

作為獨立於操作系統的開放的三維圖形軟件開發包,在其基礎上開發的應用程序能夠簡單方便的移植於各種平台。其具有七大功能:
  1. 建立3D模型:OpenGL除了能夠處理一般的2D圖形,即點、線、面的繪製外,主要任務是集合了3D立體的物體繪製函數。
  2. 圖形變換:OpenGL利用基本變換以及投影變換處理圖形。所謂的基本變換就是在處理2D平面圖形時的平移、旋轉、變比、鏡像變換。投影變換就是在處理3D立體圖形時的平行投影以及透視投影。通過變換方式,可以將2D的平面圖形清晰明瞭的變換成3D的立體圖形,從而在減少計算的時間的同時就能夠提高了圖形顯示的速度。
  3. 顏色模式:OpenGL庫中的顏色模型:使用較為廣泛的RGBA模式以及顏色索引模式(color index)。
  4. 光照、材質的設置:OpenGL庫中包含了多種光照的類型。材質是用光反射率來表示的。其原理是基於人眼的原理,場景中的物體是由光的紅綠藍的分量以及材質的紅綠藍的反射率的乘積後所形成的顏色值。
  5. 紋理映射:紋理指的是物體表面的花紋。OpenGL庫中集合了對於物體紋理的映射處理方式,能夠十分完整的復現物體表面的真實紋理。
  6. 圖像增強功能和位圖顯示的擴展功能:OpenGL的功能包括像素的讀寫、複製外,以及一些特殊的圖像處理功能:比如,融合、反走樣、霧的等等特殊的處理方式。對於圖像的重現和處理,可以使得效果更有真實感,逼真。
  7. 雙緩存功能:OpenGL創新性的運用了雙緩存形式。計算場景、生成畫面圖像、顯示畫面圖像分別將其由前台緩存和後台緩存分開處理,大大提高了計算機的運算能力以及畫面的顯示速度。 [2] 

OpenGL設計

圖形管線
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普及的部分原因是其高質量的官方文件。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程序庫

早期的 OpenGL 版本會一同發佈配套的GLU庫,提供一些同時代硬件尚不支持的簡單功能。GLU 最後一次更新規格要求是在 1998 年,對已棄用的 OpenGL 特性有依賴。
還有幾個庫也創建在OpenGL之上,提供了OpenGL本身沒有的功能:
特別是,OpenGL Performer庫——由SGI開發並可以在IRIX、LinuxMicrosoft Windows的一些版本上使用,構建於OpenGL,可以創建實時可視化仿真程序。
當開發者需要使用最新的OpenGL擴展時,他們往往需要使用GLEW庫或者是GLEE庫提供的功能,可以在程序的運行期判斷當前硬件是否支持相關的擴展,防止程序崩潰甚至造成硬件損壞。這類庫利用動態加載技術(dlsymGetProcAddress等函數)搜索各種擴展的信息。
上下文與窗口包
OpenGL 上下文(英語:OpenGL context)的創建過程相當複雜,在不同的操作系統上也需要不同的做法。因此很多遊戲開發和用户界面庫都提供了自動創建 OpenGL 上下文的功能,其中包括SDLAllegro、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 輔助對象,抽象掉了桌面版 OpenGL 與 OpenGL ES 之間的區別
    • wxWidgets——跨平台 C++ 窗口組件庫

OpenGL優勢

OpenGL相對於市面上主流的視頻處理軟件具有如下的優勢:
  1. 具有強大的通用性和可移植性,可以將其輕鬆的移植在多個不同的平台上進行二次開發。因為OpenGL本身是一個與硬件無關的軟件接口,所以,通用於市面上較為流行的平台:比如,Windows、Unix、Linux、MacOS等。
  2. 能夠轉換3D圖形設計軟件製作的模型文件。OpenGL僅僅作為一個圖形的底層圖形庫,並沒有提供直接描述某個場景地幾何實體的圓元。但是,為了其轉換的方便性,其內部集合了許多轉換函數,可以快速方便的將3DS/3DSMAX、AutoCAD等3D繪製的圖形設計製作出的DXF以及3DS模型的文件轉換成數組的形式,從而將圖像轉換成數據進行編程處理。
  3. 配備了高級圖形庫:Open Inventor、Cosmo3D、Optimizer等。這些軟件庫針對於創建、編輯以及處理分析三維的立體場景提供了高級的應用程序單元;提高不同類型的圖形格式的交換數據的能力。 [2] 

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 [1] 

OpenGL綁定

為了加強它的多語言和多平台特性,已經用很多語言開發了OpenGL的各種綁定和移植。最值得注意的是,Java3D庫已經可以利用OpenGL(另一個選擇可能是DirectX)作為它的硬件加速了。OpenGL官方網頁[1]列出了用於Java、Fortran 90、Perl、Pike、Python、Ada和Visual Basic的多個綁定。 [1] 

OpenGL高級功能

OpenGL被設計為只有輸出的,所以它只提供渲染功能。核心API沒有窗口系統、音頻、打印、鍵盤/鼠標或其他輸入設備的概念。雖然這一開始看起來像是一種限制,但它允許進行渲染的代碼完全獨立於他運行的操作系統,允許跨平台開發。然而,有些集成於原生窗口系統的東西需要允許和宿主系統交互。這通過下列附加API實現:
  • GLX- X11(包括透明的網上)
  • WGL-MicrosoftWindows
另外,GLUT庫能夠以可移植的方式提供基本的窗口功能。 [1] 

OpenGL版本

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] 

OpenGL參見

參考資料
  • 1.    Sellers, Graham; Wright, Richard S.; Haemel, Nicholas (July 31, 2013). OpenGL SuperBible: Comprehensive Tutorial and Reference (6th ed.). Addison-Wesley. ISBN 978-0-321-90294-8.
  • 2.    基於OPENCV的計算機視覺技術研究  .中國知網.2012-12-01[引用日期2022-06-15]