OpenGL for Windows NT程序設計論文

時間:2022-09-17 05:26:00

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

OpenGL for Windows NT程序設計論文

OpenGL是在SGI、Microsoft、DEC、IBM和Intel等多家世界著名計算機公司的倡導下,基于SGI的GL標準,制定的一個通用共享的開放式三維圖形標準。

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

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

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

一、OpenGL特點及功能

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

OpenGL具有七大功能。

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

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

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

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

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

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

(7)雙緩存(DoubleBuffering)動畫雙緩存即前臺緩存和后臺緩存,簡而言之,后臺緩存計算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。

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

二、OpenGLforWindowsNT圖形庫

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

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

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

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

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

三、OpenGLforWindowsNT程序設計

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

1.圖形操作描述表

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

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

2.像素格式

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

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

每個OpenGL顯示設備都支持一種指定的像素格式號。一般用一個名為PIXELFORMATDESCRIPTOR的結(jié)構(gòu)來表示某個特殊的像素格式,這個結(jié)構(gòu)包含26個屬性信息。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中每個變量值的具體含義和設置可以參

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

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

PIXELFORMATDESCRIPTORpfd=

{

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

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

PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//特性標志

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ù)

};

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

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

(3)設置像素格式

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

CClientDCclientDC(this);

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

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

fd);

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

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

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

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

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

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);

}

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

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

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