OpenGL for Windows NT程序設(shè)計(jì)論文

時(shí)間:2022-09-17 05:26:00

導(dǎo)語:OpenGL for Windows NT程序設(shè)計(jì)論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

OpenGL for Windows NT程序設(shè)計(jì)論文

OpenGL是在SGI、Microsoft、DEC、IBM和Intel等多家世界著名計(jì)算機(jī)公司的倡導(dǎo)下,基于SGI的GL標(biāo)準(zhǔn),制定的一個(gè)通用共享的開放式三維圖形標(biāo)準(zhǔn)。

前幾年,OpenGL雖然是開放式的標(biāo)準(zhǔn),但是只能在具有UNIX操作系統(tǒng)的各種昂貴的工作站之間通用;盡管工作站上的OpenGL性能優(yōu)越、編程方便、生成圖形精美逼真,但是只有少數(shù)人能體會(huì)其中樂趣,而令大多數(shù)PC機(jī)用戶望塵莫及。隨著計(jì)算機(jī)技術(shù)的發(fā)展,工作站與PC機(jī)的性能日趨接近。Microsoft公司首先將OpenGL圖形庫(kù)鏈接到WindowsNT中,目前又將OpenGL動(dòng)態(tài)庫(kù)掛到最新Windows95上,這樣,廣大PC機(jī)用戶就可充分享受OpenGL的樂趣了。更令人高興的是,目前國(guó)內(nèi)外出現(xiàn)了專門對(duì)OpenGL進(jìn)行硬件加速的三維圖形加速卡。這樣,普通用戶只

要擁有一臺(tái)Pentium90以上、16MBRAM、520MB以上硬盤容量的PC機(jī)以及一臺(tái)43cm以上的大屏幕監(jiān)視器和一塊OpenGL三維圖形加速卡組成的系統(tǒng),就能與圖形工作站相媲美,但價(jià)格卻便宜數(shù)十倍。

本文作者一直從事計(jì)算機(jī)圖形應(yīng)用開發(fā)工作。原來是在SGI工作站上利用OpenGL開發(fā)圖形程序,后來又首先在國(guó)內(nèi)第一塊三維圖形加速卡AGC-3D上基于WindowsNT的VisualC++2.0環(huán)境下繼續(xù)進(jìn)行開發(fā)。在開發(fā)過程中,同一OpenGL程序幾乎不用修改就能在兩個(gè)平臺(tái)間來回移植,效果甚好。

一、OpenGL特點(diǎn)及功能

OpenGL是一個(gè)開放的三維圖形軟件包,它獨(dú)立于窗口系統(tǒng)和操作系統(tǒng),能十分方便地在各平臺(tái)間移植。

OpenGL具有七大功能。

(1)建模OpenGL圖形庫(kù)除了提供基本的點(diǎn)、線、多邊形的繪制函數(shù)外,還提供了復(fù)雜的三維物體(如球、錐、多面體、茶壺等)以及復(fù)雜曲線和曲面(如Bezier、Nurbs等曲線或曲面)繪制函數(shù)。

(2)變換OpenGL圖形庫(kù)的變換包括基本變換和投影變換。基本變換有平移、旋轉(zhuǎn)、變比和鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。

(3)顏色模式設(shè)置OpenGL顏色模式有兩種,即RGBA模式和顏色索引(ColorIndex)。

(4)光照和材質(zhì)設(shè)置OpenGL光有輻射光(EmittedLight)、環(huán)境光(AmbientLight)、漫反射光(DiffuseLight)和鏡面光(SpecularLight)。材質(zhì)是用光反射率來表示。場(chǎng)景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍(lán)分量與材質(zhì)紅綠藍(lán)分量的反射率相乘后形成的顏色。

(5)紋理映射(TexureMapping)利用OpenGL紋理映射功能可以十分逼真地表達(dá)物體表面細(xì)節(jié)。

(6)位圖顯示和圖像增強(qiáng)圖像功能除了基本的拷貝和像素讀寫外,還提供了融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖像效果處理。

(7)雙緩存(DoubleBuffering)動(dòng)畫雙緩存即前臺(tái)緩存和后臺(tái)緩存,簡(jiǎn)而言之,后臺(tái)緩存計(jì)算場(chǎng)景、生成畫面,前臺(tái)緩存顯示后臺(tái)緩存已畫好的畫面。

此外,利用OpenGL還能實(shí)現(xiàn)深度暗示(DepthCue)、運(yùn)動(dòng)模糊(MotionBlur)等特殊效果。

二、OpenGLforWindowsNT圖形庫(kù)

OpenGL圖形庫(kù)一共有100多個(gè)函數(shù)。其中核心函數(shù)有115個(gè),它們是最基本的函數(shù),其前綴是gl;OpenGL實(shí)用庫(kù)(OpenGLutilitylibrary,GLU)的函數(shù)功能更高一些,如繪制復(fù)雜的曲線曲面、高級(jí)坐標(biāo)變換、多邊形分割等,共有43個(gè),前綴為glu;OpenGL輔助庫(kù)(OpenGLauxiliarylibrary,GLAUX)的函數(shù)是一些特殊的函數(shù),包括簡(jiǎn)單的窗口管理、輸入事件處理、某些復(fù)雜三維物體繪制等函數(shù),共有31個(gè),前綴為aux。

此外,還有六個(gè)WGL函數(shù)非常重要,專用于OpenGL和WindowsNT窗口系統(tǒng)的連接,其前綴為wgl,主要用于創(chuàng)建和選擇圖形操作描述表(renderingcontexts)以及在窗口內(nèi)任一位置顯示字符位圖。這些功能是WindowsNT對(duì)OpenGL的唯一補(bǔ)充,見表1所示。

表1管理圖形操作描述表的WGL函數(shù)

另外,還有五個(gè)Win32函數(shù)用來處理像素格式(pixelformats)和雙緩存。由于它們是對(duì)Win32系統(tǒng)的擴(kuò)展,因此不能應(yīng)用在其他OpenGL平臺(tái)上,見表2所示。

表2管理像素格式Win32函數(shù)

三、OpenGLforWindowsNT程序設(shè)計(jì)

OpenGLforWindowsNT的程序設(shè)計(jì)與OpenGLforUNIX的程序設(shè)計(jì)有一點(diǎn)小區(qū)別,關(guān)鍵就在于如何將OpenGL與不同操作系統(tǒng)下的窗口系統(tǒng)連接起來。如果調(diào)用OpenGL輔助庫(kù)窗口管理函數(shù),則不用考慮這些問題。下面將主要介紹在WindowsNT下OpenGL的程序設(shè)計(jì)關(guān)鍵。

1.圖形操作描述表

在WindowsNT下窗口程序必須首先處理設(shè)備描述表(DeviceContexts,DC),DC包含許多如何在窗口上顯示圖形的信息,即指定畫筆和刷子的顏色,設(shè)置繪圖模式、調(diào)色板、映射模式以及其他圖形屬性。同樣,OpenGLforWindowsNT的程序也必須使用DC,這與其他Windows程序類似。但是,OpenGLforWindowsNT必須處理特殊的DC圖形操作描述表,這是DC中專為OpenGL使用的一種。一個(gè)OpenGL應(yīng)用圖形操作描述表內(nèi)有OpenGL與WindowsNT窗口系統(tǒng)相關(guān)的各種信息。一個(gè)OpenGL應(yīng)用首先必須創(chuàng)建一個(gè)圖形操作描述表,然后再啟動(dòng)它,最后在所定義的窗口內(nèi)按常規(guī)方式調(diào)用OpenGL函數(shù)繪制圖形。

一個(gè)圖形操作描述表不同于其他DC,它們調(diào)用每個(gè)GDI函數(shù)都需要一個(gè)句柄,而圖形操作描述表方式下只需一個(gè)句柄就可任意調(diào)用OpenGL函數(shù)。也就是說,只要當(dāng)前啟用了某個(gè)圖形操作描述表,那么在未刪除圖形操作描述表之前可以調(diào)用任何OpenGL函數(shù),進(jìn)行各種操作。

2.像素格式

在創(chuàng)建一個(gè)圖形操作描述表之前,首先必須設(shè)置像素格式。像素格式含有設(shè)備繪圖界面的屬性,這些屬性包括繪圖界面是用RGBA模式還是顏色表模式,像系緩存是用單緩存還是雙緩存,以及顏色位數(shù)、深度緩存和模板緩存所用的位數(shù),還有其他一些屬性信息。

(1)像素格式結(jié)構(gòu)

每個(gè)OpenGL顯示設(shè)備都支持一種指定的像素格式號(hào)。一般用一個(gè)名為PIXELFORMATDESCRIPTOR的結(jié)構(gòu)來表示某個(gè)特殊的像素格式,這個(gè)結(jié)構(gòu)包含26個(gè)屬性信息。Win32定義的PIXELFORMATDESCRIPTOR如下所示:

typedefstructtagPIXELFORMATDESCRIPTOR

{

WORDnSize;

WORDnVersion;

DWORDdwFlags;

BYTEiPixelType;

BYTEcColorBits;

BYTEcRedBits;

BYTEcRedShift;

BYTEcGreenBits;

BYTEcGreenShift;

BYTEcBlueBits;

BYTEcBlueShift;

BYTEcAlphaBits;

BYTEcAlphaShift;

BYTEcAccumBits;

BYTEcAccumRedBits;

BYTEcAccumGreenBits;

BYTEcAccumBlueBits;

BYTEcAccumAlphaBits;

BYTEcDepthBits;

BYTEcStencilBits;

BYTEcAuxBuffers;

BYTEilayerType;

BYTEbReserved;

DWORDdwLayerMask;

DWORDdwVisibleMask;

DWORDdwDamageMask;

PIXELFORMATDESCRIPTOR,

*PPIXELFORMATDESCRIPTOR,

FAR*LPPIXELFORMATDESCRIPTOR;

(2)初始化PIXELFORMATDESCRIPTOR結(jié)構(gòu)

PIXELFORMATDESCRIPTOR中每個(gè)變量值的具體含義和設(shè)置可以參

考有關(guān)資料,下面舉出一個(gè)PIXELFORMATDESCRIPTOR初始化例子來簡(jiǎn)要

說明相關(guān)變量的意義。定義PIXELFORMATDESCRIPTOR結(jié)構(gòu)的pfd如下:

PIXELFORMATDESCRIPTORpfd=

{

sizeof(PIXELFORMATDESCRIPTOR),//結(jié)構(gòu)尺寸

l,//結(jié)構(gòu)版本

PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//特性標(biāo)志

PFD-TYPE-RGBA,//RGBA模式

24,//24位顏色

0,0,0,0,0,0,//不涉及這些屬性

0,0,0,0,0,0,0,//沒有alpha緩存和累積緩存

32,//32位深度緩存

0,0,//沒有模板緩存和輔助緩存

PFD-MAIN-PLANE,//主層類型

0,//保留結(jié)構(gòu)數(shù)

0,0,0,//不支持結(jié)構(gòu)數(shù)

};

在這個(gè)結(jié)構(gòu)里,前兩個(gè)變量的含義十分明顯。第三個(gè)變量dwFlags的值是PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,表明應(yīng)用程序使用OpenGL函數(shù)來繪制窗口,第四個(gè)表明當(dāng)前采用RGBA顏色模式,第五個(gè)采用24位真彩色,即1.67千萬種顏色,如果是256色系統(tǒng)則自動(dòng)實(shí)現(xiàn)顏色抖動(dòng);因?yàn)闆]有使用alpha緩存和累積緩存,所以從變量cAlphaBits到cAccumAlphaBits都設(shè)置為0;深度緩存設(shè)置為32位,這個(gè)緩存能解決三維場(chǎng)景的消隱問題;變量cAuxBuffers設(shè)置為0,在WindowsNT下不支持輔助緩存;WindowsNT下針對(duì)OpenGL變量ilayerType只能設(shè)置為PFD-MAIN-PLANE,但其他平臺(tái)也許支持PFD-OVERLAY-PLANE或PFD-UNDERLA

Y-PLANE;接下來bReserved變量只能設(shè)為0,而最后三個(gè)變量WindowsNT都不支持,故全設(shè)置成0。

(3)設(shè)置像素格式

當(dāng)初始化PIXELFORMATDESCRIPTOR結(jié)構(gòu)后,就要設(shè)置像素格式。下面幾段從VC++2.0的MFC程序中摘出的代碼就是設(shè)置像素格式的方式。代碼如下:

CClientDCclientDC(this);

intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);

BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p

fd);

第一行語句說明得到一個(gè)應(yīng)用窗口客戶區(qū)的設(shè)置描述表。

第二行調(diào)用ChoosePixelFormat()選擇一個(gè)像素格式,并將像素格式索引號(hào)返回給pixelFormat變量;函數(shù)中第一個(gè)參數(shù)是選擇像素格式的設(shè)置描述表的句柄,第二個(gè)參數(shù)是PIXELFORMATDESCRIPTOR結(jié)構(gòu)的地址。如果調(diào)用失敗則返回0;否則返回像素格式索引號(hào)。

第三行調(diào)用SetPixelFormat()設(shè)置像素格式,三個(gè)參數(shù)分別是設(shè)備描述表的句柄、像素格式索引號(hào)和PIXELFORMATDESCRIPTOR結(jié)構(gòu)的地址。如果調(diào)用成功則返回TURE;否則返回FALSE。

3.創(chuàng)建圖形操作描述表

正如前所述,必須創(chuàng)建圖形操作描述表并啟用它后,才能調(diào)用OpenGL函數(shù)在窗口內(nèi)進(jìn)行各種圖形操作。一般說來,利用MFC中增補(bǔ)的管理圖形操作描述表方法來編程比較方便。下面舉一例:

intCopenglView::OnCreate(LPCREATESTRUCTlpCreateStruct

)

{

if(CView::OnCreate(lpCreateStruct)==-1)return-1;

//TODO:Addyourspecializedcreationcodehere

PIXELFORMATDESCRIPTORpfd=

{

sizeof(PIXELFORMATDESCRIPTIOR),

//structuresizel,

//structureversionnumber

PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//propertyflags

PFD-TYPE-RGBA,//RGBAmode

24,//24bitcolor

0,0,0,0,0,0,//notconcernedwiththese

0,0,0,0,0,0,0,//noalphaoraccumbuffer

32,//32bitdepthbuffer

0,0,//nostencilorauxbuffer

PFD-MAIN-PLANE,//mainlayertype

0,//reserved

0,0,0//unsupported

};

CClientDCclientDC(this);

intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);

BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p

fd);

m-hRC=wglCreateContext(clientDC.m-hRC);

return0;

}

voidCOpenglView::onDraw(CDC*pDC)

{

COpenglDoc*pDoc=GetDocument();

ASSERT-VAILD(pDoc);

//TODO:adddrawcodefornativedatahere

wglMakeCurrent(pDC->m-hDC,m-hDC);

DrawMyOpenGL();

wglMakeCurrent(pDC->m-hDC,NULL);

}

voidCOpenglView::OnDestroy()

{

CView::OnDestroy();

//TODO:Addyourmessagehandlercodehere

wglDeleteContext(m-hRC);

}

在程序中,響應(yīng)WM-CREATE消息的函數(shù)OnCreate()僅僅只創(chuàng)建一個(gè)臨時(shí)的DC,當(dāng)函數(shù)返回時(shí),它自動(dòng)刪除。因此,在這里不可能啟用圖形操作描述表。當(dāng)應(yīng)用程序的窗口內(nèi)容得到更新后,MFC就調(diào)用OnDraw()函數(shù),在此啟用圖形操作描述表wglMakeCurrent()有效。然后,再調(diào)用自己用OpenGL寫的繪圖函數(shù)DrawMyOpenGL(),則程序就可進(jìn)行任意的OpenGL圖形操作了。當(dāng)繪圖結(jié)束后,再調(diào)用一次wglMakeCurrent(),但第二個(gè)參數(shù)設(shè)為NULL,意思是啟用圖形操作描述表無效,關(guān)閉圖形操作描述表。最后,當(dāng)應(yīng)用程序結(jié)束時(shí),MFC就調(diào)用OnDestroy()函數(shù)來響應(yīng)

WM-DESTROY消息,其中只需調(diào)用wglDeleteContext()來刪除圖形操作描述表。因?yàn)樗鶆?chuàng)建和破壞的DC只響應(yīng)WM-PAINT消息,所以在程序的末尾沒有刪除DC。

以上介紹的是OpenGLforWindowsNT的基本程序框架,有興趣的讀者不妨試一試。OpenGL具有很大的發(fā)展前途,尤其OpenGLforWindowsNT或OpenGLforWindows95以及不久將來的OpenGLforDOS都是令廣大PC用戶感到十分高興和開拓眼界的事情,但愿OpenGL在中國(guó)大地上迅速發(fā)展起來。