OpenGL for Windows NT程序設計論文

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

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

OpenGL for Windows NT程序設計論文

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

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

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

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

一、OpenGL特點及功能

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

OpenGL具有七大功能。

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

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

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

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

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

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

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

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

二、OpenGLforWindowsNT圖形庫

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

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

表1管理圖形操作描述表的WGL函數

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

表2管理像素格式Win32函數

三、OpenGLforWindowsNT程序設計

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

1.圖形操作描述表

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

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

2.像素格式

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

(1)像素格式結構

每個OpenGL顯示設備都支持一種指定的像素格式號。一般用一個名為PIXELFORMATDESCRIPTOR的結構來表示某個特殊的像素格式,這個結構包含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結構

PIXELFORMATDESCRIPTOR中每個變量值的具體含義和設置可以參

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

說明相關變量的意義。定義PIXELFORMATDESCRIPTOR結構的pfd如下:

PIXELFORMATDESCRIPTORpfd=

{

sizeof(PIXELFORMATDESCRIPTOR),//結構尺寸

l,//結構版本

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,//保留結構數

0,0,0,//不支持結構數

};

在這個結構里,前兩個變量的含義十分明顯。第三個變量dwFlags的值是PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,表明應用程序使用OpenGL函數來繪制窗口,第四個表明當前采用RGBA顏色模式,第五個采用24位真彩色,即1.67千萬種顏色,如果是256色系統則自動實現顏色抖動;因為沒有使用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結構后,就要設置像素格式。下面幾段從VC++2.0的MFC程序中摘出的代碼就是設置像素格式的方式。代碼如下:

CClientDCclientDC(this);

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

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

fd);

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

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

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

3.創建圖形操作描述表

正如前所述,必須創建圖形操作描述表并啟用它后,才能調用OpenGL函數在窗口內進行各種圖形操作。一般說來,利用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消息的函數OnCreate()僅僅只創建一個臨時的DC,當函數返回時,它自動刪除。因此,在這里不可能啟用圖形操作描述表。當應用程序的窗口內容得到更新后,MFC就調用OnDraw()函數,在此啟用圖形操作描述表wglMakeCurrent()有效。然后,再調用自己用OpenGL寫的繪圖函數DrawMyOpenGL(),則程序就可進行任意的OpenGL圖形操作了。當繪圖結束后,再調用一次wglMakeCurrent(),但第二個參數設為NULL,意思是啟用圖形操作描述表無效,關閉圖形操作描述表。最后,當應用程序結束時,MFC就調用OnDestroy()函數來響應

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

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