小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

OpenGL發(fā)展歷史

 kingwenguang 2014-12-20

    自己使用OpenGL已經(jīng)有一段時(shí)間了,當(dāng)時(shí)發(fā)現(xiàn)了一些小問(wèn)題,由于不太重要,同時(shí)也沒(méi)有使用,所以就沒(méi)有深究。但是最近看到一篇寫的不錯(cuò)的文章,把我當(dāng)時(shí)發(fā)現(xiàn)的小問(wèn)題都給解決了。

    下面轉(zhuǎn)過(guò)來(lái),同時(shí)把一些重點(diǎn)給畫出,方便大家解決問(wèn)題。

在計(jì)算機(jī)發(fā)展初期,人們就開(kāi)始從事計(jì)算機(jī)圖形的開(kāi)發(fā),但直到20世紀(jì)80年代末、90年代初,三維圖形才開(kāi)始迅速發(fā)展。于是各種三維圖形工具軟件包相繼推出,如GL,RenderMan等。隨著計(jì)算機(jī)技術(shù)的迅速發(fā)展,GL已經(jīng)進(jìn)一步發(fā)展成為OpenGL,現(xiàn)在OpenGL被認(rèn)為是高性能圖形和交互式視景處理的標(biāo)準(zhǔn)。這些三維圖形工具軟件包有些側(cè)重于使用方便,有些側(cè)重于繪制效果或與應(yīng)用軟件的連接,但沒(méi)有一種軟件包能在交互式三維圖形建模能力和編程方便程度上與OpenGL相比擬。

OpenGL(即開(kāi)放性圖形庫(kù)Open Graphics Library),是一個(gè)三維的計(jì)算機(jī)圖形和模型庫(kù),最初是美國(guó)SGI公司為圖形工作站開(kāi)發(fā)的一種功能強(qiáng)大的三維圖形機(jī)制(或者說(shuō)是一種圖形標(biāo)準(zhǔn))。它源于SGI公司為其圖形工作站開(kāi)發(fā)的IRIS GL,在跨平臺(tái)移植過(guò)程中發(fā)展成為OpenGL。SGI19927月發(fā)布1.0版,后成為工業(yè)標(biāo)準(zhǔn),由成立于1992年的獨(dú)立財(cái)團(tuán)OpenGL Architecture Review Board (ARB)控制。SGIARB成員以投票方式產(chǎn)生標(biāo)準(zhǔn),并制成規(guī)范文檔(Specification)公布,各軟硬件廠商據(jù)此開(kāi)發(fā)自己系統(tǒng)上的實(shí)現(xiàn)。只有通過(guò)了ARB規(guī)范全部測(cè)試的實(shí)現(xiàn)才能稱為OpenGL。199512ARB批準(zhǔn)了1.1版本,最新版規(guī)范是200682通過(guò)的opengl2.1,是自1.0版本后的第七次版本。新版本適應(yīng)以往早期的版本,也就是2.0, 1.5, 1.4, 1.3, 1.2, 1.1, or 1.0 GL不要任何改變就能在新版本下運(yùn)行。

OpenGL被設(shè)計(jì)成獨(dú)立于硬件,獨(dú)立于窗口系統(tǒng),在運(yùn)行各種操作系統(tǒng)的各種計(jì)算機(jī)上都可用,并能在網(wǎng)絡(luò)環(huán)境下以客戶/服務(wù)器模式工作,是專業(yè)圖形處理、科學(xué)計(jì)算等高端應(yīng)用領(lǐng)域的標(biāo)準(zhǔn)圖形庫(kù)。它低端應(yīng)用上的主要競(jìng)爭(zhēng)對(duì)手是MS-Direct3D,該圖形庫(kù)是以COM接口形式提供的,所以極為復(fù)雜,穩(wěn)定性差,另外微軟公司擁有該庫(kù)版權(quán),目前只在Windows平臺(tái)上可用。Direct3D的優(yōu)勢(shì)在速度上,但現(xiàn)在低價(jià)顯卡都能提供很好的OpenGL硬件加速,所以做3D圖形開(kāi)發(fā)使用Direct3D已沒(méi)有特別的必要,在專業(yè)圖形處理特別是高端應(yīng)用方面目前還沒(méi)有出現(xiàn)以Direct3D技術(shù)為基礎(chǔ)的例子,而游戲等低端應(yīng)用也有轉(zhuǎn)向OpenGL的趨勢(shì)。

微軟在Windows NT對(duì)OpenGL的支持始于3.51,在Windows9x中的支持始于Win95 OEM Service Release 2Windows下常用的OpenGL庫(kù)有兩種,MS實(shí)現(xiàn)的和SGI實(shí)現(xiàn)的,MS-OpenGL調(diào)用會(huì)自動(dòng)檢測(cè)是否存在顯示卡制造商提供的ICD(Installable Client DeviceDriver)驅(qū)動(dòng)程序,有則調(diào)用ICD中的例程,否則使用CPU進(jìn)行計(jì)算,所以能利用顯示卡的OpenGL加速能力。對(duì)開(kāi)發(fā)者來(lái)說(shuō)使用方法并沒(méi)有區(qū)別,只是有ICD驅(qū)動(dòng)時(shí)更快些。SGI的版本是純軟件實(shí)現(xiàn),不能利用硬件加速并且SGI已經(jīng)在1999年宣布停止支持,但這套圖形庫(kù)便于調(diào)試程序,仍有不少開(kāi)發(fā)者使用。

1999SGI宣布與MS合作開(kāi)發(fā)Ferihant,即Windows的下一代圖形處理體系,包括DirectXOpenGL的低級(jí)圖形處理接口和以場(chǎng)景圖支持為特點(diǎn)的高級(jí)接口,并且就此停止對(duì)其在Windows下的OpenGL實(shí)現(xiàn)的支持以示決心。此舉令世人矚目,大家都以為Windows圖形處理快要過(guò)上幸福生活了,然而,不久,SGI宣布中止合作,并撤回派出的科學(xué)家,Ferihant基本上夭折。SGI 稱終止合作的原因是MS不肯積極合作,光想把SGI 的技術(shù)合并進(jìn)DirectX,但是真正內(nèi)幕不詳。不過(guò)以SGI在圖形處理界的老大地位來(lái)說(shuō),還是有幾分可信度的,因?yàn)?/span>MS最初支持OpenGL就不積極。

OpenGL可以運(yùn)行在當(dāng)前各種流行操作系統(tǒng)之上,如Mac OS、Unix、Windows 95/98、Windows NT/2000Linux、OPENStep、Python、BeOS等。各種流行的編程語(yǔ)言都可以調(diào)用OpenGL中的庫(kù)函數(shù),如C、C++、Fortran、Ada、Java。OpenGL完全獨(dú)立于各種網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。目前,Microsoft公司、SGI公司、ATT公司的Unix軟件實(shí)驗(yàn)室、IBM公司、DEC公司、SUN公司、HP公司等幾家在計(jì)算機(jī)市場(chǎng)占主導(dǎo)地位的大公司都采用了OpenGL圖形標(biāo)準(zhǔn)。值得一提的是,由于Microsoft公司在Windows NTWindows 95/98中提供OpenGL標(biāo)準(zhǔn),使得OpenGL在微機(jī)中得到了廣泛應(yīng)用。尤其是在OpenGL三維圖形加速卡和微機(jī)圖形工作站推出后,人們可以在微機(jī)上實(shí)現(xiàn)CAD設(shè)計(jì)、仿真模擬、三維游戲等,從而使得應(yīng)用OpenGL及其應(yīng)用軟件來(lái)創(chuàng)建三維圖形變得更有機(jī)會(huì)、更為方便。

OpenGL作為一個(gè)性能優(yōu)越的圖形應(yīng)用程序設(shè)計(jì)界面(API),適用于廣泛的計(jì)算機(jī)環(huán)境。從個(gè)人計(jì)算機(jī)到工作站和超級(jí)計(jì)算機(jī),OpenGL都能實(shí)現(xiàn)高性能的三維圖形功能。由于許多在計(jì)算機(jī)界具有領(lǐng)導(dǎo)地位的計(jì)算機(jī)公司紛紛采用OpenGL作為三維圖形應(yīng)用程序設(shè)計(jì)界面,所以OpenGL應(yīng)用程序具有廣泛的移植性。因此,OpenGL已成為目前的三維圖形開(kāi)發(fā)標(biāo)準(zhǔn),是從事三維圖形開(kāi)發(fā)工作的技術(shù)人員所必須掌握的開(kāi)發(fā)工具。OpenGL應(yīng)用領(lǐng)域十分寬廣,如軍事、電視廣播、CAD/CAM/CAE、娛樂(lè)、藝術(shù)造型、醫(yī)療影像、虛擬世界等。

1.1 opengl1.1

1995年,SGI推出了更為完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改進(jìn)打印機(jī)支持,在增強(qiáng)元文件中包含OpenGL的調(diào)用,頂點(diǎn)數(shù)組的新特性,提高頂點(diǎn)位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識(shí)的傳輸速度,引入了新的紋理特性等等。

1.2 opengl1.3

20018月,ARB發(fā)布OpenGL 1.3規(guī)范,它增加了立方紋理貼圖、紋理環(huán)境、多重采樣、紋理框架壓縮等擴(kuò)展指令,但是改進(jìn)程度非常有限。

1.3 opengl1.4

20027月,ARB正式發(fā)布OpenGL 1.4,它也只加入了深度紋理/陰影紋理、頂點(diǎn)設(shè)計(jì)框架、自動(dòng)紋理貼圖等簡(jiǎn)單的功能。

1.3 opengl1.5

2003年的7月,ARB公布OpenGL 1.5規(guī)范。OpenGL 1.5內(nèi)包含ARB制定的正式擴(kuò)展規(guī)格繪制語(yǔ)言OpenGL Shading Language v1.0),該語(yǔ)言用于著色對(duì)象、頂點(diǎn)著色、片斷著色等擴(kuò)展功能,同時(shí)也將作為下一代OpenGL 2.0版本的內(nèi)核。OpenGL 1.5的變化還增加了頂點(diǎn)緩沖對(duì)象(可提高透視性能)、非乘方紋理(可提高紋理內(nèi)存的使用效率)以及陰影功能、隱蔽查詢功能等等。其主要內(nèi)容包括

l 頂點(diǎn)Buffer Object:進(jìn)行頂點(diǎn)配列方式可以提高透視性能
l Shadow
功能:增加用來(lái)比較Shadow映射的函數(shù)
l
隱蔽查詢(QUERY):為提高Curling性能采用非同步隱蔽測(cè)試
l
非乘方紋理(Texture):提高mipmap等紋理內(nèi)存的使用效率
l OpenGL Shading Language v.1.0
:用于著色(shader)對(duì)象、頂點(diǎn)著色以及片斷著色技術(shù)(fragment shader )的擴(kuò)展功能
1.4 opengl2.0

OpenGL 1.0推出后的相當(dāng)長(zhǎng)的一段時(shí)間里,OpenGL唯一做的只是增加了一些擴(kuò)展指令集,這些擴(kuò)展指令是一些繪圖功能,像是ClearCoatMultisample、視頻及繪圖的整合工具(某些是通過(guò)OpenML的努力而開(kāi)發(fā)出來(lái)的,它本身屬于OpenGL ARB擴(kuò)展指令之一。
   OpenGL 2.0
將在OpenGL 1.3基礎(chǔ)上進(jìn)行修改擴(kuò)充、但它將有下面五個(gè)方面的重大改進(jìn):復(fù)雜的核心被徹底精簡(jiǎn);完全的硬件可編程能力;改進(jìn)的內(nèi)存管理機(jī)制、支持高級(jí)像素處理;擴(kuò)展至數(shù)字媒體領(lǐng)域,使之跨越高端圖形和多媒體范疇;支持嵌入式圖形應(yīng)用。
   
為了在獲得強(qiáng)大功能的同時(shí)保持理想的兼容性,OpenGL 2.0經(jīng)歷以下兩個(gè)發(fā)展階段:第一個(gè)階段注重兼容能力和平滑過(guò)渡,為此,OpenGL 2.0核心將在精簡(jiǎn)后的OpenGL 1.3功能模塊的基礎(chǔ)上加上可完全兼容的新功能共同組成,這種做法在滿足兼容性的同時(shí),還可將原有OpenGL中數(shù)量眾多、且相互糾纏不清的擴(kuò)展指令進(jìn)行徹底精簡(jiǎn)。 第一階段的任務(wù)只是為了過(guò)渡,而第二階段才是OpenGL 2.0的真正成熟期。此時(shí),ARB將合成出一個(gè)OpenGL 2.0”內(nèi)核,純內(nèi)核將包含更多新增加的精簡(jiǎn)型API函數(shù),這些函數(shù)具有完全的可編程特性、結(jié)構(gòu)簡(jiǎn)單高效、功能強(qiáng)大且應(yīng)用靈活。除了完成這項(xiàng)任務(wù)外,ARB組織還得指導(dǎo)開(kāi)發(fā)商拋棄繁瑣的OpenGL 1.X、轉(zhuǎn)用更具彈性的OpenGL 2.0”。

1.5 opengl2.1

OpenGL version 2.1200682發(fā)布,是最初版本1.0后的第七個(gè)版本。盡管增加了版本的層析,支持高層析的編程shaders,但版本能夠適于早期的版本,意味著運(yùn)行2.0, 1.5, 1.4, 1.3, 1.2, 1.1, or 1.0 GL的程序不用任何改變就可運(yùn)行。

OpenGL2.1與當(dāng)前的2.0版本相比,雖然版本號(hào)變更不如DX9DX10那么巨大,但它卻增加了多項(xiàng)實(shí)用的技術(shù)和功能,例如向后兼容增強(qiáng)型OpenGL的先進(jìn)管道規(guī)劃,其中包括:優(yōu)化GPU和顯存之間并行工作時(shí)間,提高象素緩沖和對(duì)象的象素和質(zhì)感快速緩沖利用率;增加標(biāo)準(zhǔn)彩色圖像質(zhì)感sRGB色彩空間應(yīng)用促進(jìn)管理的靈活性;并增加了許多新的shader彈性調(diào)配,包括非平方矩陣支持,支持陣列流對(duì)象和碎塊點(diǎn)位置時(shí),干擾和shaders屬性不變的變量shader代碼提高可靠性。1. GLSL升級(jí)至1.2版;2. 支持非正方形的矩陣. UniformMatrix {2x3,3x2,2x4,4x2,3x4,4x3}fv 3. 象素緩沖對(duì)象(Pixel Buffer Object).  它擴(kuò)充了緩沖對(duì)象的接口.現(xiàn)在緩沖區(qū)對(duì)象可以支持頂點(diǎn)數(shù)組和象素?cái)?shù)據(jù)了.象素緩沖對(duì)象能加速在GPU內(nèi)存中進(jìn)行的緩沖區(qū)之間的數(shù)據(jù)拷貝及其他象素操作.;4. sRGB紋理. 遵循IEC 61966-2-1.標(biāo)準(zhǔn)的sRGB顏色空間的紋理格式(包括壓縮和非壓縮格式).OpenGL 2.1 adds backwards compatible enhancements to OpenGL's advanced programmable pipeline including: Pixel Buffer Objects for fast texture and pixel copies between frame buffer and buffer objects in GPU memory; texture images specified in standard sRGB color space for enhanced application color management flexibility; and numerous additions to increase the flexibility of shader programming including non-square matrix support, support for arrays as first-class objects, a fragment position query in shaders using Point Sprites and an invariant attribute for variables to enhance shader code reliability.

OpenGL2.1的效果

2 OpenGL擴(kuò)展(OpenGL Extensions

OpenGLDirect3D比較起來(lái),最大的一個(gè)長(zhǎng)處就是其擴(kuò)展機(jī)制。硬件廠商開(kāi)發(fā)出一個(gè)新功能,可以針對(duì)新功能開(kāi)發(fā)OpenGL擴(kuò)展,軟件開(kāi)發(fā)人員通過(guò)這個(gè)擴(kuò)展就可以使用新的硬件功能。所以雖然顯卡的發(fā)展速度比OpenGL版本更新速度快得多,但程序員仍然可以通過(guò)OpenGL使用最新的硬件功能。而Direct3D則沒(méi)有擴(kuò)展機(jī)制,硬件的新功能要等到微軟發(fā)布新版DirectX后才可能支持。
OpenGL
擴(kuò)展也不是沒(méi)有缺點(diǎn),正因?yàn)楦鱾€(gè)硬件廠商都可以開(kāi)發(fā)自己的擴(kuò)展,所以擴(kuò)展的數(shù)目比較大,而且有點(diǎn)混亂,有些擴(kuò)展實(shí)現(xiàn)的相同的功能,可因?yàn)槭遣煌瑥S商開(kāi)發(fā)的,接口卻不一樣,所以程序中為了實(shí)現(xiàn)這個(gè)功能,往往要為不同的顯卡寫不同的程序。這個(gè)問(wèn)題在OpenGL 2.0出來(lái)后可能會(huì)得到解決,OpenGL 2.0的一個(gè)目標(biāo)就是統(tǒng)一擴(kuò)展,減少擴(kuò)展數(shù)目。

2.1 擴(kuò)展名
每個(gè)擴(kuò)展都有一個(gè)擴(kuò)展名,擴(kuò)展名類似如下形式:

GL_ARB_multitexture

第一段GL,用來(lái)表示針對(duì)OpenGL哪部分開(kāi)發(fā)的擴(kuò)展,有以下幾個(gè)值:


GL –
針對(duì)OpenGL核心的擴(kuò)展

WGL
針對(duì)Windows平臺(tái)的擴(kuò)展

GLX
針對(duì)Unix / Linux平臺(tái)的擴(kuò)展

GLU
針對(duì)OpenGL Utility Library的擴(kuò)展


ARB,用來(lái)表示是誰(shuí)開(kāi)發(fā)的這個(gè)擴(kuò)展,常見(jiàn)以下幾個(gè)值:


ARB –
經(jīng)OpenGL Architecture Review BoardOpenGL管理機(jī)構(gòu))正式核準(zhǔn)的擴(kuò)展,往往由廠商開(kāi)發(fā)的擴(kuò)展發(fā)展而來(lái),如果同時(shí)存在廠商開(kāi)發(fā)的擴(kuò)展和ARB擴(kuò)展,應(yīng)該優(yōu)先使用ARB擴(kuò)展

EXT –
被多個(gè)硬件廠商支持的擴(kuò)展

NV – nVIDIA
公司開(kāi)發(fā)的擴(kuò)展

ATI – ATI
公司開(kāi)發(fā)的擴(kuò)展

ATIX– ATI
公司開(kāi)發(fā)的實(shí)驗(yàn)性擴(kuò)展

SGI Silicon Graphics
SGI)公司開(kāi)發(fā)的擴(kuò)展

SGIX– Silicon Graphics
SGI
)公司開(kāi)發(fā)的實(shí)驗(yàn)性擴(kuò)


第三段multitexture就是真正的擴(kuò)展名了,如multitexture就是多重紋理擴(kuò)展。


2.2
使用OpenGL擴(kuò)展

要使用一個(gè)OpenGL擴(kuò)展,首先必須檢查顯卡是否支持這個(gè)擴(kuò)展,以下代碼可以獲取一個(gè)顯卡支持的的OpenGL擴(kuò)展:
const char *str = glGetString( GL_EXTENSIONS );
函數(shù)返回一個(gè)字符串指針,這個(gè)字符串就是顯卡所支持的所有擴(kuò)展的擴(kuò)展名,不同的擴(kuò)展名之間用空格隔開(kāi),形如:

"GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters ……"

OpenGL
擴(kuò)展往往都會(huì)新增一些函數(shù),在Windows平臺(tái)上,這些函數(shù)不是通過(guò).lib庫(kù)連接到程序里的,而要在運(yùn)行時(shí)動(dòng)態(tài)獲得函數(shù)的指針。我們以GL_ARB_point_parameters擴(kuò)展為例看看怎么獲得函數(shù)指針。

首先要定義函數(shù)指針類型,

typedef void (APIENTRY * PFNGLPOINTPARAMETERFARBPROC)(GLenum pname,
GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname,
const GLfloat *params);

這個(gè)工作SGI已經(jīng)為我們做好,它提供了一個(gè)頭文件 glext.h ,里面有目前絕大多數(shù)擴(kuò)展的常量和函數(shù)指針定義,下載下來(lái)放到編譯器的include/GL文件夾下面,然后在程序里面加上:

#include <GL/glext.h>

就可以在程序中使用常量和函數(shù)指針類型了。

然后要定義函數(shù)指針:

PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;

再檢查顯卡是否支持GL_ARB_point_parameters擴(kuò)展,其中isExtensionSupported是自定義的一個(gè)函數(shù),就是在glGetString( GL_EXTENSIONS )返回的字符串里查找是否存在指定的擴(kuò)展名:

int hasPointParams = isExtensionSupported("GL_ARB_point_parameters");

如果支持,就可以用wglGetProcAddress函數(shù)獲取擴(kuò)展函數(shù)的指針:
if (hasPointParams)
{
glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC
/
wglGetProcAddress( "glPointParameterfEXT" );
glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) /
wglGetProcAddress( "glPointParameterfvEXT" );
}

最后就可以在程序里使用擴(kuò)展函數(shù):


if (hasPointParams)
{
static GLfloat quadratic[3] = { 0.25, 0.0, 1/60.0 };
glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, quadratic);
glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
}

另外,下面代碼說(shuō)明如何訪問(wèn)擴(kuò)展函數(shù):(資料來(lái)源于csdn知識(shí)庫(kù))

調(diào)用wglGetProcAddress函數(shù)訪問(wèn)一個(gè)不在標(biāo)準(zhǔn)OpenGL庫(kù)中的擴(kuò)展函數(shù)。如果該擴(kuò)展函數(shù)存在當(dāng)前的執(zhí)行(implementation)中,那么wglGetProcAddress返回一個(gè)用來(lái)訪問(wèn)該函數(shù)的函數(shù)指針。否則,wglGetProcAddress返回NULL.

例如,要訪問(wèn)glAddSwapHintRectWIN擴(kuò)展函數(shù),如下調(diào)用
wglGetProcAddress:

// Get a pointer to the extension function.
typedef void (WINAPI *FNSWAPHINT)(GLint, GLint, GLsizei, GLsizei);
fnSwapHint = (FNSWAPHINT)wglGetProcAddress("glAddSwapHintRectWIN");

// Actual call to glAddSwapHintRectWIN.
if (fnSwapHint != NULL)
(*fnSwapHint)(0, 0, 100, 100);

2.3 WGL
擴(kuò)展


glGetString( GL_EXTENSIONS )
取得的擴(kuò)展字符串中并不包括針對(duì)Windows平臺(tái)的WGL擴(kuò)展,WGL擴(kuò)展串要通過(guò)WGL_ARB_extensions_string擴(kuò)展來(lái)獲得,以下代碼演示了如何獲得WGL擴(kuò)展串:

定義WGL_ARB_extensions_string擴(kuò)展新增函數(shù)wglGetExtensionsStringARB的函數(shù)指針類型,同樣這個(gè)工作SGI已經(jīng)為我們做好,只不過(guò)不在glext.h中,而在它提供的另外一個(gè)頭文件 wglext.h 中:

typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)(
HDC hdc);

定義函數(shù)指針:

PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;

檢查是否支持WGL_ARB_extensions_string擴(kuò)展,如果不支持,表示這個(gè)顯卡不支持WGL擴(kuò)展,如果支持,則得到wglGetExtensionsStringARB函數(shù)的指針,并調(diào)用它得到WGL擴(kuò)展串:

int hasWGLext = isExtensionSupported("WGL_ARB_extensions_string");
if (hasWGLext)
{
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) /
wglGetProcAddress( "wglGetExtensionsStringARB" );
const char *wglExt = wglGetExtensionsStringARB( hdc );
……
}

2.4 OpenGL
版本

一些常用的OpenGL擴(kuò)展會(huì)在新版的OpenGL中加到OpenGL核心中去,成為OpenGL標(biāo)準(zhǔn)的一部分,可以簡(jiǎn)化程序開(kāi)發(fā),程序員使用這些功能時(shí)不必做繁瑣的擴(kuò)展初始化工作。比如多重紋理功能,在OpenGL1.2.1加入到OpenGL核心中,以前要使用多重紋理,要先檢查是否支持GL_ARB_multitexture擴(kuò)展,然后初始化glActiveTextureARB等函數(shù),很麻煩,而OpenGL1.2后,則可以直接使用glActiveTexture函數(shù)。
不過(guò),這種簡(jiǎn)化只有Mac/Unix/Linux程序員才能享受到,在Windows平臺(tái)上沒(méi)有這么簡(jiǎn)單。微軟為了維護(hù)Direct3D,對(duì)OpenGL的支持很消極,其OpenGL實(shí)現(xiàn)仍然是1.1。由于Windows上的OpenGL程序最終都會(huì)動(dòng)態(tài)鏈接到微軟的OpenGL32.dll,可OpenGL32.dll只支持OpenGL 1.1,使我們不能直接使用新版OpenGL,仍然要用擴(kuò)展訪問(wèn)OpenGL1.1以來(lái)新增的功能。


2.5 OpenGL
擴(kuò)展資料

All About OpenGL Extensions
:必讀。
討論OpenGL擴(kuò)展機(jī)制,講述了如何閱讀擴(kuò)展官方說(shuō)明書(shū),并舉了一些擴(kuò)展的例子。
OpenGL Extension Registry

SGI維護(hù),列出了目前公開(kāi)的所有擴(kuò)展及其官方說(shuō)明書(shū)。

OpenGL Hardware Registry
Delphi3D.net維護(hù),列出了目前幾乎所有3D加速卡的OpenGL硬件信息,包括其支持的擴(kuò)展。當(dāng)然,這里面列的擴(kuò)展不能作為程序的依據(jù),程序中要使用某個(gè)擴(kuò)展,還是要先檢查顯卡是否支持。因?yàn)橥瑯拥娘@卡,如果驅(qū)動(dòng)程序不同,支持的擴(kuò)展也不相同,往往新的驅(qū)動(dòng)程序會(huì)加入新的擴(kuò)展,丟掉一些廢棄的擴(kuò)展。

2.6 OpenGL
硬件加速

Windows平臺(tái)上,OpenGL驅(qū)動(dòng)可能有三種模式:純軟件、MCDICD


純軟件模式:微軟提供一個(gè)OpenGL的軟件實(shí)現(xiàn),所有渲染操作均由CPU完成,速度很慢。如果安裝系統(tǒng)時(shí)使用Windows自帶的顯卡驅(qū)動(dòng)程序,那么OpenGL程序就會(huì)運(yùn)行在軟件模式下。而且由于微軟有自己的Direct3D,所以對(duì)OpenGL的支持很消極,它的OpenGL純軟件實(shí)現(xiàn)只支持OpenGL1.1,而目前OpenGL的最新版本為
1.4

MCD
Mini Client Driver):MCD是早期微軟在Windows NT上支持OpenGL時(shí),為了簡(jiǎn)化驅(qū)動(dòng)開(kāi)發(fā)時(shí)使用的一個(gè)模型。在這個(gè)模型中,OpenGL渲染管線的變換、光照部分仍然由軟件實(shí)現(xiàn),而光柵化部分則由硬件廠商實(shí)現(xiàn),因此只要硬件支持,MCD可以硬件加速光柵化部分。MCD雖然可以簡(jiǎn)化驅(qū)動(dòng)開(kāi)發(fā),但是功能限制太大,現(xiàn)在市面上的3D加速卡均支持硬件變換和光照,MCD卻不能利用這一特性,看上去MCD已經(jīng)沒(méi)有存在的價(jià)值


ICD
Installable Client Driver):ICD是一個(gè)完整的OpenGL驅(qū)動(dòng)模型,比MCD復(fù)雜得多。硬件廠商要實(shí)現(xiàn)完整的OpenGL渲染管線,如變換、光照、光柵化等,因此只要硬件支持,ICD可以硬件加速整個(gè)OpenGL渲染管線。我們通常說(shuō)的OpenGL硬件加速就是指的通過(guò)ICD模型獲得的硬件加速,而現(xiàn)在硬件廠商提供的OpenGL驅(qū)動(dòng)程序也都是依照ICD模型開(kāi)發(fā)的。主要硬件廠商的ICD已經(jīng)可以支持OpenGL的最新版1.4

Windows
怎么實(shí)現(xiàn)OpenGL硬件加速呢?OpenGL32.dll是微軟的OpenGL 1.1純軟件實(shí)現(xiàn),我們的程序都要?jiǎng)討B(tài)鏈接到這個(gè)dll。如果安裝3D芯片廠商的驅(qū)動(dòng)程序,會(huì)將一個(gè)不同名字的dll放到Windows系統(tǒng)目錄下,比如在Windows 2000下安裝nVIDIA GeForce2 MX的驅(qū)動(dòng)程序,會(huì)在系統(tǒng)目錄下放一個(gè)nvoglnt.dll(這就是nVIDIAOpenGL驅(qū)動(dòng)),并在注冊(cè)表中登記nvoglnt.dll,讓Windows知道硬件加速OpenGL驅(qū)動(dòng)的名字,以后運(yùn)行OpenGL程序,OpenGL32.dll就會(huì)把OpenGL調(diào)用直接轉(zhuǎn)到nvoglnt.dll。


Windows
平臺(tái)上,一個(gè)OpenGL程序是否使用硬件加速由三個(gè)因素決定,這三個(gè)因素缺一不可,否則程序都會(huì)運(yùn)行于純軟件模式:


是否有一塊3D加速卡


是否安裝了顯卡廠商提供的最新的驅(qū)動(dòng)程序,Windows自帶的顯卡驅(qū)動(dòng)程序并不會(huì)提供OpenGL硬件加速能力


指定的像素格式是否被顯卡硬件所支持


判斷一種像素格式是否被顯卡硬件所支持,可以用函數(shù)DescribePixelFormat取得該像素格式的數(shù)據(jù),然后看結(jié)構(gòu)體PIXELFORMATDESCRIPTOR中的dwFlags的值,如果


PFD_GENERIC_FORMAT
被置1,并且PFD_GENERIC_ACCELERATED被置0,即
(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
!(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明該像素格式不被顯卡硬件支持,使用該像素格式的OpenGL程序?qū)⑹褂眉冘浖J戒秩?/span>

PFD_GENERIC_FORMAT
被置1,并且PFD_GENERIC_ACCELERATED被置1,即

(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明該像素格式被顯卡硬件支持,并且程序使用MCD模式渲染

PFD_GENERIC_FORMAT
被置0,并且PFD_GENERIC_ACCELERATED被置0,

!(pfd.dwFlags & PFD_GENERIC_FORMAT) &&
!(pfd.dwFlags & PFD_GENERIC_ACCELERATED)
表明該像素格式被顯卡硬件支持,并且程序使用ICD模式渲染

3 OpenGL Extension

這個(gè)軟件可以自動(dòng)測(cè)試顯卡對(duì)OpenGL的版本支持和擴(kuò)展命令。

4、如何使用擴(kuò)展

如果你在Windows平臺(tái)下開(kāi)發(fā)OpenGL程序,那么系統(tǒng)中自帶的OpenGL庫(kù)就是1.1的,如果想使用1.2或者更高版本的OpenGL庫(kù),那么只能使用OpenGL擴(kuò)展。很多參考書(shū)上都會(huì)提到OpenGL2.0OpenGL2.1,但是微軟對(duì)OpenGL的支持只到1.1,1.1以后微軟就不再支持了,為什么,因?yàn)槲④浉氚l(fā)展自家的DirectX。所以如果想使用OpenGL1.1以上的功能或者函數(shù),只能使用OpenGL擴(kuò)展,這些擴(kuò)展是一些OpenGL團(tuán)體或個(gè)人開(kāi)發(fā)出來(lái)的能Windows上使用的OpenGL1.1以后的一些功能及函數(shù)。所以,在Windows上根本就沒(méi)有什么OpenGL2.0的頭文件或庫(kù)文件了,OpenGL1.1以后的東西都已經(jīng)以擴(kuò)展的形式存在了,而且,并沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),你可以使用glex,glew,glee等等。

是否能用擴(kuò)展和顯卡的功能有關(guān),const     GLubyte   * glGetString( GLenum name )我們以GL_EXTENSIONS為參數(shù)調(diào)用該函數(shù),就能獲得當(dāng)前顯卡所支持的所有擴(kuò)展,像下面這樣:const GLubyte *str = glGetString(GL_EXTENSIONS) ; cout << str << endl ;輸出的各個(gè)擴(kuò)展之間以空格分隔,如果這些擴(kuò)展中包含GL_ARB_imaging,那么你就可以使用glBlendEquation這個(gè)函數(shù)了。當(dāng)然,這樣查詢的只是gl擴(kuò)展,還可以用gluGetString獲得glu擴(kuò)展。在判斷了顯卡所支持的擴(kuò)展以后,就可以使用該擴(kuò)展中所包含的函數(shù)了。

41 使用glext

這里下載:(http://graphics./pointsho ... lext_8h-source.html)

a)頭文件的包含 這個(gè)文件并不是Windows系統(tǒng)中原有的,需要到網(wǎng)上下載。使用的時(shí)候有一點(diǎn)要注意,如果程序中還用到了glut.h文件,那么一定要把glext.h放在glut.h的后面,因?yàn)?span lang="EN-US">glext.h要用到gl.h,而glut.h中包含了gl.h,如果順序搞錯(cuò)了,編譯的時(shí)候會(huì)有一大堆錯(cuò)誤,正確的順序如下:

#include <iostream>

#include <windows.h>

#include <GL/glut.h>

#include <GL/glext.h>

b)獲取函數(shù)指針

先定義函數(shù)指針,PFNGLBLENDEQUATIONPROC  glBlendEquation = NULL;

再獲取函數(shù)地址, 使用wglGetProcAddress函數(shù),注意這一句要加在使用glBlendEquation函數(shù)的語(yǔ)句之前才有效,最后后面緊跟著使用glBlendEquation的函數(shù)語(yǔ)句,切記不要加在所有子程序的外面,否則獲取的指針是無(wú)效的

glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");

例如可以這樣加:

PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");

switch(key)

{ case 'a':

case 'A':  //Note: glBlendEquation is a subset of GL_ARB_imaging, please call glGetString

//first to confirm whether your video card support this extension.
                   glBlendEquation(GL_FUNC_ADD) ;

 break ;

         case 's':

         case 'S':

                   glBlendEquation(GL_FUNC_SUBTRACT) ;

                   break ;

4.2 使用glew

glew也是一個(gè)擴(kuò)展庫(kù),包含了OpenGL中許多核心及擴(kuò)展函數(shù),現(xiàn)在的版本是1.3.5,支持OpenGL2.1,可以到這里下載:

http://glew./

上面的方法可能有些麻煩,如果已經(jīng)下載了glew庫(kù)的話,那么可以直接使用該擴(kuò)展,但是使用之前首先要確定你的顯卡是否支持該擴(kuò)展。方法如下:首先還是要判斷顯卡是否支持該擴(kuò)展,我們這里假定已經(jīng)支持,

1)
.包含頭文件glew.h,注意這里和上面不同,這回glut.h要放在glew.h的后面了
像下面這樣
#include <GL/glew.h>

#include <GL/glut.h>
然后就可以在程序中直接使用glBlendEquation了,其他擴(kuò)展的判斷和使用方法與此類似。
最后還有一點(diǎn)切記!那就是還要調(diào)用glewInit() ;來(lái)初始化一下方可使用擴(kuò)展,如下:
GLenum err = glewInit() ;

         if (GLEW_OK != err)
         {
                   MessageBoxA(NULL, "error", "My Window", 1) ;
         }

   你
現(xiàn)在可以使用擴(kuò)展了!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多