定義:OpenGL(英語(yǔ):Open Graphics Library,譯名:開(kāi)放圖形庫(kù)或者“開(kāi)放式圖形庫(kù)”)是用于渲染2D、3D矢量圖形的跨語(yǔ)言、跨平臺(tái)的應(yīng)用程序編程接口(API)。這個(gè)接口由近350個(gè)不同的函數(shù)調(diào)用組成,用來(lái)從簡(jiǎn)單的圖形比特繪制復(fù)雜的三維景象。而另一種程序接口系統(tǒng)是僅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虛擬實(shí)境、科學(xué)可視化程序和電子游戲開(kāi)發(fā)。
OpenGL本身不是一種編程語(yǔ)言,它是計(jì)算機(jī)圖形與硬件之間的一種軟件接口。它包含了七百多個(gè)函數(shù),是一個(gè)三維空間的計(jì)算機(jī)圖形和模型庫(kù),程序員可以利用這些函數(shù)來(lái)方便地構(gòu)建三維物體模型,并實(shí)現(xiàn)相應(yīng)的交互操作。 SGI 公司在1992年6月發(fā)布1.0版,后成為工業(yè)標(biāo)準(zhǔn)。雖然 OpenGL由SGI公司創(chuàng)立,但目前 OpenGL標(biāo)準(zhǔn)由1992年成立的 OpenGL系統(tǒng)結(jié)構(gòu)審核委員會(huì)(OpenGL Architecture Review Board,ARB)以投票方式產(chǎn)生,并制成規(guī)范文檔公布,各軟硬件廠商據(jù)此開(kāi)發(fā)自己系統(tǒng)上的實(shí)現(xiàn)。ARB每隔四年舉行一次會(huì)議,對(duì) OpenGL的規(guī)范進(jìn)行改善和維護(hù)。2006年,SGI公司將 OpenGL標(biāo)準(zhǔn)的控制權(quán)移交給 Khronos小組。目前 Khronos小組負(fù)責(zé)對(duì) OpenGL的發(fā)展和升級(jí)。
--------------------------------------------------------------------------------------------------------------------
引伸閱讀:
簡(jiǎn)介:
OpenGL的高效實(shí)現(xiàn)(利用了圖形加速硬件)存在于Windows,部分UNIX平臺(tái)和Mac OS。這些實(shí)現(xiàn)一般由顯示設(shè)備廠商提供,而且非常依賴于該廠商提供的硬件。開(kāi)放源代碼庫(kù)Mesa是一個(gè)純基于軟件的圖形API,它的代碼兼容于OpenGL。但是,由于許可證的原因,它只聲稱是一個(gè)“非常相似”的API。
OpenGL規(guī)范由1992年成立的OpenGL架構(gòu)評(píng)審委員會(huì)(ARB)維護(hù)。ARB由一些對(duì)創(chuàng)建一個(gè)統(tǒng)一的、普遍可用的API特別感興趣的公司組成。根據(jù)OpenGL官方網(wǎng)站,2002年6月的ARB投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是創(chuàng)立成員之一,但已于2003年3月退出。
設(shè)計(jì):
圖形管線
OpenGL規(guī)范描述了繪制2D和3D圖形的抽象API。盡管這些API可以完全通過(guò)軟件實(shí)現(xiàn),但它是為大部分或者全部使用硬件加速而設(shè)計(jì)的。
OpenGL的API定義了若干可被客戶端程序調(diào)用的函數(shù),以及一些具名整型常量(例如,常量GL_TEXTURE_2D對(duì)應(yīng)的十進(jìn)制整數(shù)為3553)。雖然這些函數(shù)的定義表面上類(lèi)似于C編程語(yǔ)言,但它們是語(yǔ)言獨(dú)立的。因此,OpenGL有許多語(yǔ)言綁定,值得一提的包括:JavaScript綁定的WebGL(基于OpenGL ES 2.0在Web瀏覽器中的進(jìn)行3D渲染的API);C綁定的WGL、GLX和CGL;iOS提供的C綁定;Android提供的Java和C綁定。
OpenGL不僅語(yǔ)言無(wú)關(guān),而且平臺(tái)無(wú)關(guān)。規(guī)范只字未提獲得和管理OpenGL上下文相關(guān)的內(nèi)容,而是將這些作為細(xì)節(jié)交給底層的窗口系統(tǒng)。出于同樣的原因,OpenGL純粹專(zhuān)注于渲染,而不提供輸入、音頻以及窗口相關(guān)的API。
OpenGL是一個(gè)不斷進(jìn)化的API。新版OpenGL規(guī)范會(huì)定期由Khronos Group發(fā)布,新版本通過(guò)擴(kuò)展API來(lái)支持各種新功能。每個(gè)版本的細(xì)節(jié)由Khronos Group的成員一致決定,包括顯卡廠商、操作系統(tǒng)設(shè)計(jì)人員以及類(lèi)似Mozilla和谷歌的一般性技術(shù)公司。
除了核心API要求的功能之外,GPU供應(yīng)商可以通過(guò)擴(kuò)展的形式提供額外功能。擴(kuò)展可能會(huì)引入新功能和新常量,并且可能放松或取消現(xiàn)有的OpenGL函數(shù)的限制。然后一個(gè)擴(kuò)展就分成兩部分發(fā)布:包含擴(kuò)展函數(shù)原型的頭文件和作為廠商的設(shè)備驅(qū)動(dòng)。供應(yīng)商使用擴(kuò)展公開(kāi)自定義的API而無(wú)需獲得其他供應(yīng)商或Khronos Group的支持,這大大增加了OpenGL的靈活性。OpenGL Registry負(fù)責(zé)所有擴(kuò)展的收集和定義。
每個(gè)擴(kuò)展都與一個(gè)簡(jiǎn)短的標(biāo)識(shí)符關(guān)系,該標(biāo)識(shí)符基于開(kāi)發(fā)公司的名稱。例如,英偉達(dá)(nVidia)的標(biāo)識(shí)符是NV。如果多個(gè)供應(yīng)商同意使用相同的API來(lái)實(shí)現(xiàn)相同的功能,那么就用EXT標(biāo)志符。這種情況更進(jìn)一步,Khronos Group的架構(gòu)評(píng)審委員(Architecture Review Board,ARB)正式批準(zhǔn)該擴(kuò)展,那么這就被稱為一個(gè)“標(biāo)準(zhǔn)擴(kuò)展”,標(biāo)識(shí)符使用ARB。第一個(gè)ARB擴(kuò)展是GL_ARB_multitexture。
OpenGL每個(gè)新版本中引入的功能,特別是ARB和EXT類(lèi)型的擴(kuò)展,通常由數(shù)個(gè)被廣泛實(shí)現(xiàn)的擴(kuò)展功能組合而成。
文檔
OpenGL普及的部分原因是其高質(zhì)量的官方文件。OpenGL架構(gòu)評(píng)審委員會(huì)隨規(guī)范一同發(fā)布了一系列包含API變化更新的手冊(cè)。這些手冊(cè)因其封面顏色而眾所周知。
紅寶書(shū)
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.
橙寶書(shū)
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
相關(guān)程序庫(kù)
早期的 OpenGL 版本會(huì)一同發(fā)布配套的GLU庫(kù),提供一些同時(shí)代硬件尚不支持的簡(jiǎn)單功能。GLU 最后一次更新規(guī)格要求是在 1998 年,對(duì)已棄用的 OpenGL 特性有依賴。
還有幾個(gè)庫(kù)也創(chuàng)建在OpenGL之上,提供了OpenGL本身沒(méi)有的功能:
GLFW
GLUT
GLEW、GLEE
特別是,OpenGL Performer庫(kù)——由SGI開(kāi)發(fā)并可以在IRIX、Linux和Microsoft Windows的一些版本上使用,構(gòu)建于OpenGL,可以創(chuàng)建實(shí)時(shí)可視化仿真程序。
當(dāng)開(kāi)發(fā)者需要使用最新的OpenGL擴(kuò)展時(shí),他們往往需要使用GLEW庫(kù)或者是GLEE庫(kù)提供的功能,可以在程序的運(yùn)行期判斷當(dāng)前硬件是否支持相關(guān)的擴(kuò)展,防止程序崩潰甚至造成硬件損壞。這類(lèi)庫(kù)利用動(dòng)態(tài)加載技術(shù)(dlsym、GetProcAddress等函數(shù))搜索各種擴(kuò)展的信息。
上下文與窗口包
OpenGL 上下文(英語(yǔ):OpenGL context)的創(chuàng)建過(guò)程相當(dāng)復(fù)雜,在不同的操作系統(tǒng)上也需要不同的做法。因此很多游戲開(kāi)發(fā)和用戶界面庫(kù)都提供了自動(dòng)創(chuàng)建 OpenGL 上下文的功能,其中包括SDL、Allegro、SFML、FLTK、Qt等。也有一些庫(kù)是專(zhuān)門(mén)用來(lái)創(chuàng)建 OpenGL 窗口的,其中最早的便是GLUT,后被freeglut取代,比較新的也有GLFW可以使用。
以下包可以用來(lái)創(chuàng)建并管理 OpenGL 窗口,也可以管理輸入,但幾乎沒(méi)有除此以外的其它功能:
GLFW——跨平臺(tái)窗口和鍵盤(pán)、鼠標(biāo)、手柄處理;偏向游戲
freeglut——跨平臺(tái)窗口和鍵盤(pán)、鼠標(biāo)處理;API 是 GLUT API 的超集,同時(shí)也比 GLUT 更新、更穩(wěn)定
GLUT——早期的窗口處理庫(kù),已不再維護(hù)
支持創(chuàng)建 OpenGL 窗口的還有一些“多媒體庫(kù)”,同時(shí)還支持輸入、聲音等類(lèi)似游戲的程序所需要的功能:
Allegro 5——跨平臺(tái)多媒體庫(kù),提供針對(duì)游戲開(kāi)發(fā)的 C API
SDL——跨平臺(tái)多媒體庫(kù),提供 C API
SFML——跨平臺(tái)多媒體庫(kù),提供 C++ API;同時(shí)也提供 C#、Java、Haskell、Go 等語(yǔ)言的綁定
窗口包
FLTK——小型的跨平臺(tái) C++ 窗口組件庫(kù)
Qt——跨平臺(tái) C++ 窗口組件庫(kù),提供了許多 OpenGL 輔助對(duì)象,抽象掉了桌面版 OpenGL 與 OpenGL ES 之間的區(qū)別
wxWidgets——跨平臺(tái) C++ 窗口組件庫(kù)
歷史
1980年代,開(kāi)發(fā)可以用在各種各樣圖形硬件上的軟件是個(gè)真正的挑戰(zhàn)。通常,軟件開(kāi)發(fā)人員為每種硬件編寫(xiě)自定義的接口和驅(qū)動(dòng)程序。但這非常昂貴并會(huì)導(dǎo)致大量工作的重復(fù)。
20世紀(jì)90年代初,SGI成為工作站3D圖形領(lǐng)域的領(lǐng)導(dǎo)者。其IRISGL的API被認(rèn)為是最先進(jìn)的科技并成為事實(shí)上的行業(yè)標(biāo)準(zhǔn),而基于開(kāi)放標(biāo)準(zhǔn)的PHIGS則相形見(jiàn)絀。IRIS GL更容易使用,而且還支持即時(shí)模式的渲染。相比之下,PHIGS難于使用并且功能老舊。
SGI的競(jìng)爭(zhēng)對(duì)手(包括Sun、惠普和IBM)通過(guò)擴(kuò)展PHIGS標(biāo)準(zhǔn)也能將3D硬件投入市場(chǎng)。這反過(guò)來(lái)導(dǎo)致SGI市場(chǎng)份額的削弱,因?yàn)橛性絹?lái)越多的3D圖形硬件供應(yīng)商進(jìn)入市場(chǎng)。為攻占市場(chǎng),SGI決定把IRIS GL API轉(zhuǎn)變?yōu)橐豁?xiàng)開(kāi)放標(biāo)準(zhǔn),即OpenGL。
然而,SGI擁有大量的軟件客戶,對(duì)他們來(lái)說(shuō)從IRIS GL遷移到OpenGL將需要巨額投資。此外,IRIS GL的應(yīng)用程序接口擁有與3D圖形不相關(guān)的函數(shù)。例如,它包括窗口、鍵盤(pán)和鼠標(biāo)的API,部分原因是由于它是在X Window系統(tǒng)和Sun公司的NeWS系統(tǒng)之前開(kāi)發(fā)的。而且,IRIS GL庫(kù)由于授權(quán)和專(zhuān)利問(wèn)題并不適合開(kāi)放。上述種種因素要求SGI繼續(xù)支持先進(jìn)和專(zhuān)有的IRIS Inventor和IRIS Performer應(yīng)用程序接口。
IRIS GL的限制之一是只能訪問(wèn)由底層硬件支持的功能。如果圖形硬件不支持一項(xiàng)功能,那么該應(yīng)用程序?qū)⒉荒苁褂盟?。OpenGL通過(guò)為硬件不具備的功能提供軟件支持克服了此問(wèn)題,這就允許應(yīng)用程序在相對(duì)較弱的系統(tǒng)中使用先進(jìn)的圖形技術(shù)。OpenGL標(biāo)準(zhǔn)化了訪問(wèn)硬件的方式:硬件接口程序的開(kāi)發(fā)(有時(shí)也稱為設(shè)備驅(qū)動(dòng)程序)交由硬件制造商,而窗口功能委托給底層操作系統(tǒng)。讓大量不同種類(lèi)的圖形硬件講同一種語(yǔ)言影響深遠(yuǎn),它為軟件開(kāi)發(fā)者進(jìn)行3D軟件發(fā)展提供了更高層次的平臺(tái)。
1992年,SGI公司領(lǐng)導(dǎo)了OpenGL架構(gòu)審查委員會(huì)(OpenGL ARB)的創(chuàng)建。該委員會(huì)由若干公司組成,負(fù)責(zé)未來(lái)OpenGL規(guī)范的維護(hù)和擴(kuò)展。
微軟在1995年發(fā)布Direct3D,Direct 3D最終成為OpenGL的主要競(jìng)爭(zhēng)對(duì)手。1997年12月17日,微軟和SGI發(fā)起華氏溫標(biāo)項(xiàng)目,旨在統(tǒng)一OpenGL和Direct3D的接口。1998年,惠普加入。后來(lái),由于SGI的財(cái)政限制、微軟的戰(zhàn)略以及缺乏行業(yè)普遍支持,項(xiàng)目1999年遭棄。
2006年7月,OpenGL架構(gòu)評(píng)審委員會(huì)投票決定將OpenGL API標(biāo)準(zhǔn)的控制權(quán)交給Khronos Group。
綁定
為了加強(qiáng)它的多語(yǔ)言和多平臺(tái)特性,已經(jīng)用很多語(yǔ)言開(kāi)發(fā)了OpenGL的各種綁定和移植。最值得注意的是,Java3D庫(kù)已經(jīng)可以利用OpenGL(另一個(gè)選擇可能是DirectX)作為它的硬件加速了。OpenGL官方網(wǎng)頁(yè)列出了用于Java、Fortran 90、Perl、Pike、Python、Ada和Visual Basic的多個(gè)綁定。
高級(jí)功能
OpenGL被設(shè)計(jì)為只有輸出的,所以它只提供渲染功能。核心API沒(méi)有窗口系統(tǒng)、音頻、打印、鍵盤(pán)/鼠標(biāo)或其他輸入設(shè)備的概念。雖然這一開(kāi)始看起來(lái)像是一種限制,但它允許進(jìn)行渲染的代碼完全獨(dú)立于他運(yùn)行的操作系統(tǒng),允許跨平臺(tái)開(kāi)發(fā)。然而,有些集成于原生窗口系統(tǒng)的東西需要允許和宿主系統(tǒng)交互。這通過(guò)下列附加API實(shí)現(xiàn):
GLX- X11(包括透明的網(wǎng)上)
WGL-MicrosoftWindows
另外,GLUT庫(kù)能夠以可移植的方式提供基本的窗口功能。
版本
OpenGL進(jìn)化自(而且風(fēng)格很相似)SGI的早期3D接口IRIS GL。IRIS GL的一個(gè)限制是它只能訪問(wèn)底層硬件提供的特性。如果圖形硬件不支持例如紋理映射這樣的功能,那么應(yīng)用程序就不能使用它。OpenGL通過(guò)在軟件上對(duì)硬件不支持的特性提供支持的方法克服了這個(gè)問(wèn)題,允許應(yīng)用程序在相對(duì)低配置的系統(tǒng)上使用高級(jí)的圖形特性。Fahrenheit項(xiàng)目是Microsoft和SGI之間的聯(lián)合行動(dòng),為了統(tǒng)一OpenGL和Direct3D接口的目的。它一開(kāi)始提出了一些把規(guī)則帶給交互3D計(jì)算機(jī)圖形API世界的承諾,但因?yàn)镾GI的財(cái)政限制,這個(gè)項(xiàng)目后來(lái)被放棄了。
2002年微軟的DirectX 9提出了全新的Shader繪圖功能以及高端著色語(yǔ)言(HLSL),OpenGL霸主地位開(kāi)始被瓦解。這使得3DLabs了解到必須開(kāi)發(fā)全新的OpenGL 2.0版本,但僅加入支持GLSL的功能。2006年Khronos接手OpenGL,立刻著手發(fā)展Longs Peak與Mount Evans。2008年推出OpenGL 3,但評(píng)價(jià)普遍不高。
2010年3月10日, OpenGL同時(shí)推出了3.3和4.0版本,同年7月26日又發(fā)布了4.1版本。2011年8月8日發(fā)布4.2版本。2013年發(fā)布4.3版。
引伸閱讀來(lái)源:百度百科