<>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();
2.1、OpenGL基本理解
OpenGL是一個與硬件圖形發(fā)生器的軟件接口,它包括了100多個圖形操作函數(shù),開發(fā)者可以利用這些函數(shù)來構造景物模型、進行三維圖形交互軟件的開發(fā)。正如上一章所述,OpenGL是一個高性能的圖形開發(fā)軟件包。OpenGL支持網(wǎng)絡,在網(wǎng)絡系統(tǒng)中用戶可以在不同的圖形終端上運行程序顯示圖形。 OpenGL作為一個與硬件獨立的圖形接口,它不提供與硬件密切相關的設備操作函數(shù),同時,它也不提供描述類似于飛機、汽車、分子形狀等復雜形體的圖形操作函數(shù)。用戶必須從點、線、面等最基本的圖形單元開始構造自己的三維模型。當然,象OpenInventor那樣更高一級的基于OpenGL的三維圖形建模開發(fā)軟件包將提供方便的工具。因此OpenGL的圖形操作函數(shù)十分基本、靈活。例如OpenGL中的模型繪制過程就多種多樣,內(nèi)容十分豐富,OpenGL提供了以下的對三維物體的繪制方式:
- 網(wǎng)格線繪圖方式(wireframe)
這種方式僅繪制三維物體的網(wǎng)格輪廓線。
- 深度優(yōu)先網(wǎng)格線繪圖方式(depth_cued)
用網(wǎng)格線方式繪圖,增加模擬人眼看物體一樣,遠處的物體比近處的物體要暗些。
- 反走樣網(wǎng)格線繪圖方式(antialiased)
用網(wǎng)格線方式繪圖,繪圖時采用反走樣技術以減少圖形線條的參差不齊。
- 平面消隱繪圖方式(flat_shade)
對模型的隱藏面進行消隱,對模型的平面單元按光照程度進行著色但不進行光滑處理。
- 光滑消隱繪圖方式(smooth_shade)
對模型進行消隱按光照渲染著色的過程中再進行光滑處理,這種方式更接近于現(xiàn)實。
- 加陰影和紋理的繪圖方式(shadows、textures)
在模型表面貼上紋理甚至于加上光照陰影,使得三維景觀象照片一樣。
- 運動模糊的繪圖方式(motion-blured)
模擬物體運動時人眼觀察所感覺的動感現(xiàn)象。
- 大氣環(huán)境效果(atmosphere-effects)
在三維景觀中加入如霧等大氣環(huán)境效果,使人身臨其境。
- 深度域效果(depth-of-effects)
類似于照相機鏡頭效果,模型在聚焦點處清晰,反之則模糊。
這些三維物體繪圖和特殊效果處理方式,說明OpenGL已經(jīng)能夠模擬比較復雜的三維物體或自然景觀,這就是我們所面對的OpenGL。
2.2、OpenGL工作流程
整個OpenGL的基本工作流程如下圖:

其中幾何頂點數(shù)據(jù)包括模型的頂點集、線集、多邊形集,這些數(shù)據(jù)經(jīng)過流程圖的上部,包括運算器、逐個頂點操作等;圖像數(shù)據(jù)包括象素集、影像集、位圖集等,圖像象素數(shù)據(jù)的處理方式與幾何頂點數(shù)據(jù)的處理方式是不同的,但它們都經(jīng)過光柵化、逐個片元(
Fragment)處理直至把最后的光柵數(shù)據(jù)寫入幀緩沖器。在OpenGL中的所有數(shù)據(jù)包括幾何頂點數(shù)據(jù)和象素數(shù)據(jù)都可以被存儲在顯示列表中或者立即可以得到處理。OpenGL中,顯示列表技術是一項重要的技術。
OpenGL要求把所有的幾何圖形單元都用頂點來描述,這樣運算器和逐個頂點計算操作都可以針對每個頂點進行計算和操作,然后進行光柵化形成圖形碎片;對于象素數(shù)據(jù),象素操作結果被存儲在紋理組裝用的內(nèi)存中,再象幾何頂點操作一樣光柵化形成圖形片元。
整個流程操作的最后,圖形片元都要進行一系列的逐個片元操作,這樣最后的象素值BZ送入幀緩沖器實現(xiàn)圖形的顯示。
2.3、OpenGL圖形操作步驟
在上一節(jié)中說明了OpenGL的基本工作流程,根據(jù)這個流程可以歸納出在OpenGL中進行主要的圖形操作直至在計算機屏幕上渲染繪制出三維圖形景觀的基本步驟:
1)根據(jù)基本圖形單元建立景物模型,并且對所建立的模型進行數(shù)學描述(OpenGL中把:點、線、多邊形、圖像和位圖都作為基本圖形單元)。
2)把景物模型放在三維空間中的合適的位置,并且設置視點(
viewpoint)以觀察所感興趣的景觀。
3)計算模型中所有物體的色彩,其中的色彩根據(jù)應用要求來確定,同時確定光照條件、紋理粘貼方式等。
4)把景物模型的數(shù)學描述及其色彩信息轉換至計算機屏幕上的象素,這個過程也就是光柵化(
rasterization)。
在這些步驟的執(zhí)行過程中,OpenGL可能執(zhí)行其他的一些操作,例如自動消隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據(jù)需要對象素數(shù)據(jù)進行操作。
三、WindowsNT下的OpenGL
3.1、Windows NT下的OpenGL函數(shù)
如前面的章節(jié)所述,Windows NT下的OpenGL同樣包含100多個庫函數(shù),這些函數(shù)都按一定的格式來命名,即每個函數(shù)都以gl開頭。Windows NT下的OpenGL除了具有基本的OpenGL函數(shù)外,還支持其他四類函數(shù):
相應函數(shù) |
具體說明 |
OpenGL實用庫 |
43個函數(shù),每個函數(shù)以glu開頭。 |
OpenGL輔助庫 |
31個函數(shù),每個函數(shù)以aux開頭。 |
Windows專用庫函數(shù)(WGL) |
6個函數(shù),每個函數(shù)以wgl開頭。 |
Win32 API函數(shù) |
5個函數(shù),函數(shù)前面沒有專用前綴。 |
在OpenGL中有115個核心函數(shù),這些函數(shù)是最基本的,它們可以在任何OpenGL的工作平臺上應用。這些函數(shù)用于建立各種各樣的形體,產(chǎn)生光照效果,進行反走樣以及進行紋理映射,進行投影變換等等。由于這些核心函數(shù)有許多種形式并能夠接受不同類型的參數(shù),實際上這些函數(shù)可以派生出300 多個函數(shù)。
OpenGL的實用函數(shù)是比OpenGL核心函數(shù)更高一層的函數(shù),這些函數(shù)是通過調(diào)用核心函數(shù)來起作用的。這些函數(shù)提供了十分簡單的用法,從而減輕了開發(fā)者的編程負擔。OpenGL的實用函數(shù)包括紋理映射、坐標變換、多邊形分化、繪制一些如橢球、圓柱、茶壺等簡單多邊形實體(本指南將詳細講述這些函數(shù)的具體用法)等。這部分函數(shù)象核心函數(shù)一樣在任何OpenGL平臺都可以應用。
OpenGL的輔助庫是一些特殊的函數(shù),這些函數(shù)本來是用于初學者做簡單的練習之用,因此這些函數(shù)不能在所有的OpenGL平臺上使用,在Windows NT環(huán)境下可以使用這些函數(shù)。這些函數(shù)使用簡單,它們可以用于窗口管理、輸入輸出處理以及繪制一些簡單的三維形體。為了使OpenGL的應用程序具有良好的移植性,在使用OpenGL輔助庫的時候應謹慎。
6個WGL函數(shù)是用于連接OpenGL與Windows NT的,這些函數(shù)用于在Windows NT環(huán)境下的OpenGL窗口能夠進行渲染著色,在窗口內(nèi)繪制位圖字體以及把文本放在窗口的某一位置等。這些函數(shù)把Windows與OpenGL揉合在一起。最后的5個Win32函數(shù)用于處理象素存儲格式和雙緩沖區(qū),顯然這些函數(shù)僅僅能夠用于Win32系統(tǒng)而不能用于其它OpenGL平臺。
3.2、OpenGL基本功能
OpenGL能夠對整個三維模型進行渲染著色,從而繪制出與客觀世界十分類似的三維景象。另外OpenGL還可以進行三維交互、動作模擬等。具體的功能主要有以下這些內(nèi)容。
- 模型繪制
OpenGL能夠繪制點、線和多邊形。應用這些基本的形體,我們可以構造出幾乎所有的三維模型。OpenGL通常用模型的多邊形的頂點來描述三維模型。如何通過多邊形及其頂點來描述三維模型,在指南的在后續(xù)章節(jié)會有詳細的介紹。
- 模型觀察
在建立了三維景物模型后,就需要用OpenGL描述如何觀察所建立的三維模型。觀察三維模型是通過一系列的坐標變換進行的。模型的坐標變換在使觀察者能夠在視點位置觀察與視點相適應的三維模型景觀。在整個三維模型的觀察過程中,投影變換的類型決定觀察三維模型的觀察方式,不同的投影變換得到的三維模型的景象也是不同的。最后的視窗變換則對模型的景象進行裁剪縮放,即決定整個三維模型在屏幕上的圖象。
- 顏色模式的指定
OpenGL 應用了一些專門的函數(shù)來指定三維模型的顏色。程序員可以選擇二個顏色模式,即RGBA模式和顏色表模式。在RGBA模式中,顏色直接由RGB值來指定;在顏色表模式中,顏色值則由顏色表中的一個顏色索引值來指定。程序員還可以選擇平面著色和光滑著色二種著色方式對整個三維景觀進行著色。
- 光照應用
用OpenGL繪制的三維模型必須加上光照才能更加與客觀物體相似。OpenGL提供了管理四種光(輻射光、環(huán)境光、鏡面光和漫反射光)的方法,另外還可以指定模型表面的反射特性。
- 圖象效果增強
OpenGL提供了一系列的增強三維景觀的圖象效果的函數(shù),這些函數(shù)通過反走樣、混合和霧化來增強圖象的效果。反走樣用于改善圖象中線段圖形的鋸齒而更平滑,混合用于處理模型的半透明效果,霧使得影像從視點到遠處逐漸褪色,更接近于真實。
- 位圖和圖象處理
OpenGL還提供了專門對位圖和圖象進行操作的函數(shù)。
- 紋理映射
三維景物因缺少景物的具體細節(jié)而顯得不夠真實,為了更加逼真地表現(xiàn)三維景物,OpenGL提供了紋理映射的功能。OpenGL提供的一系列紋理映射函數(shù)使得開發(fā)者可以十分方便地把真實圖象貼到景物的多邊形上,從而可以在視窗內(nèi)繪制逼真的三維景觀。
- 實時動畫
為了獲得平滑的動畫效果,需要先在內(nèi)存中生成下一幅圖象,然后把已經(jīng)生成的圖象從內(nèi)存拷貝到屏幕上,這就是OpenGL的雙緩存技術(double buffer)。OpenGL提供了雙緩存技術的一系列函數(shù)。
- 交互技術
目前有許多圖形應用需要人機交互,OpenGL提供了方便的三維圖形人機交互接口,用戶可以選擇修改三維景觀中的物體。
3.3、Windows NT下OpenGL的結構
OpenGL的作用機制是客戶(
client)/服務器(sever)機制,即客戶(用OpenGL繪制景物的應用程序)向服務器(即OpenGL內(nèi)核)發(fā)布OpenGL命令,服務器則解釋這些命令。大多數(shù)情況下,客戶和服務器在同一機器上運行。正是OpenGL的這種客戶/服務器機制,OpenGL可以十分方便地在網(wǎng)絡環(huán)境下使用。因此Windows NT下的OpenGL是網(wǎng)絡透明的。正象Windows的圖形設備接口(GDI)把圖形函數(shù)庫封裝在一個動態(tài)鏈接庫(Windows NT下的GDI32.DLL)內(nèi)一樣,OpenGL圖形庫也被封裝在一個動態(tài)鏈接庫內(nèi)(OPENGL32.DLL)。受客戶應用程序調(diào)用的OpenGL函數(shù)都先在OPENGL32.DLL中處理,然后傳給服務器WINSRV.DLL。OpenGL的命令再次得到處理并且直接傳給Win32的設備驅動接口(Device Drive Interface,DDI),這樣就把經(jīng)過處理的圖形命令送給視頻顯示驅動程序。下圖簡要說明這個過程:
圖3-1 OpenGL在Windows NT下運行機制
在三維圖形加速卡的GLINT圖形加速芯片的加速支持下,二個附加的驅動程序被加入這個過程中。一個OpenGL可安裝客戶驅動程序(
Installable Client Driver,ICD)被加在客戶這一邊,一個硬件指定DDI(
Hardware-specific DDI)被加在服務器這邊,這個驅動程序與Wind32 DDI是同一級別的。
圖3-2 在三維圖形加速下OpenGL運行機制