OpenGL完全教程 第三章 使用OpenGL繪圖_第1頁
OpenGL完全教程 第三章 使用OpenGL繪圖_第2頁
OpenGL完全教程 第三章 使用OpenGL繪圖_第3頁
OpenGL完全教程 第三章 使用OpenGL繪圖_第4頁
OpenGL完全教程 第三章 使用OpenGL繪圖_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、OpenGL 完全教程 第三章 使用OpenGL 繪圖作者:何詠 日期:2006-2-3 20:50:47 點(diǎn)擊:3959如需轉(zhuǎn)載本文,請聲明作者及出處。第三章 使用OpenGL 繪圖從本章開始,我們將正式開始使用OpenGL 來繪制圖形。學(xué)習(xí)本章內(nèi)容,你將發(fā)現(xiàn)使用計算機(jī)繪制3D 圖形原來如此容易。你將了解:設(shè)置可視區(qū)域并創(chuàng)建投影在3D 空間中繪制基本圖元使用深度測試使用背面剔除提高渲染速度將繪制的圖形輸出到屏幕上3.1 繪制之前的必要工作從章節(jié)2.1中,你應(yīng)該了解到,在使用OpenGL 繪圖之前,我們應(yīng)該決定使用何種投影方式,設(shè)置渲染后的圖形應(yīng)出現(xiàn)在窗口的位置等等。本節(jié)中,我們將了解這些步驟

2、的具體實(shí)現(xiàn)方法。在OpenGL 初始化完成之后,我們應(yīng)該進(jìn)行一些視圖設(shè)置。首先是設(shè)定視見區(qū)域,即告訴OpenGL 應(yīng)把渲染之后的圖形繪制在窗體的哪個部位。當(dāng)視見區(qū)域是整個窗體時,OpenGL將把渲染結(jié)果繪制到整個窗口。我們調(diào)用glViewPort 函數(shù)來決定視見區(qū)域:procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei;其中,參數(shù)X,Y指定了視見區(qū)域的左下角在窗口中的位置,一般情況下為(0,0),Width和Height 指定了視見區(qū)域的寬度和高度。注意OpenGL 使用的窗口坐標(biāo)和WindowsGDI 使用的窗口坐

3、標(biāo)是不一樣的。圖3.1-1表示了在WindowsGDI 中的窗口坐標(biāo),而圖3.1-2則是OpenGL 所定義的窗口坐標(biāo)。 圖3.1-1 WindowsGDI下的窗體坐標(biāo)圖3.1-2 OpenGL所定義的窗體坐標(biāo)例如,要設(shè)置如圖3.1-3中的視見區(qū)域,我們應(yīng)該調(diào)用函數(shù): glViewPort(100,100,Width,Height;圖3.1-3接下來,我們要設(shè)置一種投影變換。投影變換分為平行投影和透視投影。平行投影中,物體無論遠(yuǎn)近,大小都是一樣的,而透視投影則相反。因此,透視投影更像是我們眼睛所看到的景物。但在某些特殊的時候, 平行投影還是有它的作用的,比如3D 建摸程序。圖3.1-4是甲烷分

4、子模型在平行投影下的渲染結(jié)果,而圖3.1-5是在透視投影下的渲染結(jié)果??梢钥吹?,平行投影下,四個氫原子(綠色的球體大小是一樣的,而在透視投影下,遠(yuǎn)處的氫原子要小一 些。圖3.1-4 平行投影下的甲烷分子模型圖3.1-5 透視投影下的甲烷分子模型值得注意的是,本節(jié)所講的內(nèi)容涉及矩陣變換這一主題。關(guān)于OpenGL 中的矩陣,我們將在下一章中作具體說明。因此本章不討論矩陣變換的原理。調(diào)用glOrtho 函數(shù),可以創(chuàng)建一個平行投影:procedure glOrtho(left, right, bottom, top, zNear, zFar: GLdouble;其中,lef t 指定了該平行投影最左邊

5、的平面;right指定了該平行投影最右邊的平面;b otto m 指定了該平行投影最下邊的平面;top指定了該平行投影最上邊的平面;zN e a r ,zFa r 指定了近修剪平面和遠(yuǎn)修建平面。也就是說,僅當(dāng)頂點(diǎn)v (x,y,z 滿足條件 xle f t a nd x我們使用下面的代碼創(chuàng)建一個平行投影:glMatrixMode(GL_PROJECTION;glOrtho(-ClientWidth div 2,ClientWidth div 2,-ClientHeight div 2,ClientHeight div 2,1,100;glMatrixMode(GL_MODELVIEW;在上面的代

6、碼中,你看到了一個陌生的函數(shù):glMa tri xM ode。它的作用是告訴OpenGL 接下來我們將要設(shè)置投影變換矩陣。這涉及到下一章的主題,這里就不多討論了?,F(xiàn)在你可以暫時把上面的代碼當(dāng)作固定代碼使用。透視投影對遠(yuǎn)處的物體根據(jù)距離進(jìn)行縮短或壓縮變換。這使得遠(yuǎn)處的物體看起來小些,從而更加真實(shí)。因?yàn)檫h(yuǎn)處的景物更小,所以隨著距離的增加,觀察者應(yīng)該能看到更多的景物。因此,透視投影的可視區(qū)域應(yīng)是一個被稱為平截頭體的幾何形狀。如圖3.1-6所示。 圖3.1-6 透視投影和平行投影相似,只要把函數(shù)glOrtho 的調(diào)用該為gl Fu st um 或者gl u Perspe c ti v e。調(diào)用gl F

7、 r u st um 函數(shù),可以指定一個平截頭體。procedure glFrustum (left, right, bottom, top, zNear, zFar: GLdouble; 可以看到,glF r u st um 的參數(shù)和glOrtho 完全一樣。但對于平截頭體的性質(zhì)來說,使用gl F r u st um 總是不太直觀。因此gl u Perspe c ti v e 反而更常用: procedure gluPerspective(fovy, aspect, zNear, zFar: GLdouble;其中,f o vy 為垂直方向上可見區(qū)域的角度(即上修剪平面和下修剪平面的二面角)

8、;a spe c t 為高度與寬度的縱橫比(即 Width/Height 的比值);zN e a r 和zFa r 為近、遠(yuǎn)修剪平面。如圖3.1-7 所示。圖3.1-7 由gl u Perspe c ti v e 定義的平截頭體我們用下面的代碼定義透視投影:glMatrixMode(GL_PROJECTION;gluPerspective(60,ClientWidth/ClientHeight,1,zFar;glMatrixMode(GL_MODELVIEW;其中,zFa r 根據(jù)要繪制場景的大小設(shè)置不同的值。這一步是可選的。我們可以調(diào)用gl C le a r C olor 函數(shù)來設(shè)置用于清空

9、屏幕和緩沖區(qū)的顏色。glClearColor(R,G,B,A:GLFloat;其中,R, G ,B,A 分別表示顏色的R、G 、B分值和透明度值。取值范圍均為0-1之間。例如,下面的代碼把背景色設(shè)置為黑色:glClearColor(0,0,0,1;一般地,我們把所有繪制函數(shù)的調(diào)用寫在R ender Sc ene 過程中。在每次繪制之前,我們都應(yīng)該清空屏幕和緩沖區(qū)。 下面的代碼用指定的清空顏色清空它們:procedure RenderScene;beginglClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT;. 圖形繪制.end ;TfrmMain

10、 = class (TFcedure FormCreate(Sender: TObject;privateprocedure SetView;procedure RenderScene; /渲染函數(shù)procedure InitializeOpenGL; /用于初始化OpenGL 渲染環(huán)境public public declarations end ;然后,在F or mC re a te 過程中添加對過程S etView 的調(diào)用:procedure FormCreate(Sender: TObject;beginInitializeOpenGL;SetView;end ;我們的S

11、 etView 過程看起來應(yīng)該是這樣的:procedure SetView;beginglClearColor(0,0,0,0;/設(shè)置背景顏色為黑色glViewPort(0,0,ClientWidth,ClientHeight;/指定OpenGL 在此區(qū)域內(nèi)繪圖。glMatrixMode(GL_PROJECTION;/設(shè)置視圖投影變換矩陣glLoadIdentity;/加載單位矩陣。glOrtho(0,ClientWidth,ClientHeight,0,1,-1;/創(chuàng)建平行投影空間。glMatrixMode(GL_MODELVIEW;/將矩陣變換對象切換為模型視圖變換。end ;3.2 使用

12、OpenGL 繪制基本圖元一切復(fù)雜的東西都是由簡單而基本的元素構(gòu)成的。在OpenGL 中,組成復(fù)雜圖形的基本元素被成為圖元。掌握了基本圖元的繪制方法,就能繪制出任何復(fù)雜的物體。OpenGL 為我們提供了以下幾種圖元:點(diǎn)線連續(xù)線封閉線三角形三角條形三角扇形四邊形多邊形繪制三角形是非常簡單的。我們只需通過glVerte x 的調(diào)用傳給OpenGL 必要的頂點(diǎn)值即可。在調(diào)用glVerte x 之前和之后,我們需要調(diào)用gl B egin 和gl E nd 這兩個函數(shù)來標(biāo)識圖元的開始和結(jié)束。 在調(diào)用gl B egin 函數(shù)時,我們需要傳入一個參數(shù),以告訴OpenGL 我們將繪制什么類型的圖元。傳入GL

13、_TRI AN GL ES 表明我們將要繪制三角形。例如:glBegin(GL_TRIANGLES;glVertex(1,0,1;glVertex(0,1,0;glVertex(1,1,0;glEnd;將繪制一個以點(diǎn)(1, 0, 1 、(0, 1, 0 、(1, 1, 0為頂點(diǎn)的三角形。和繪制三角形相同,只要把gl B egin 的參數(shù)該為GL _TRI AN GL E_STRIP 即可。例如:glBegin(GL_TRIANGLE_STRIP;glVertex(1,0,1;glVertex(0,1,0;glVertex(1,1,0;glVertex(1,3,0;glVertex(4,8,2;

14、glEnd;和繪制三角形相同,只要把gl B egin 的參數(shù)該為GL _TRI AN GL E_FAN即可。由于繪制方法大致相同,這里不再舉例了。下面列舉了繪制這些圖元應(yīng)傳給gl B egin 的值。點(diǎn):GL_POI NTS線:GL_LI NES連續(xù)線:GL_LI NE_STRIP封閉線:GL_LI NE_LOOP值得說明的是圖元GL _LI NE_STRIP 和GL _LI NE_LOOP。GL _LI NE_STRIP 和GL _TRI AN GL E_STRIP 原理是一樣的。也就是從第2個頂點(diǎn)開始,第n 個頂點(diǎn)與第n-1個頂點(diǎn)構(gòu)成一條直線。例如:glBegin(GL_LINE_STR

15、IP;glVertex(A.x,A.y,A.z;glVertex(B.x,B.y,B.z;glVertex(C.x,C.y,C.z;glEnd;將繪制出兩條線段:線段AB 和線段BC 。圖元GL _LI NE_LOOP 建立在GL _LI NE_STRIP 的基礎(chǔ) 之上。與GL _LI NE_STRIP 不同的是,GL_LI NE_LOOP 會在最后一個頂點(diǎn)和第一個頂點(diǎn)之間再連一根直線,構(gòu)成一個封閉圖形。如果把上述代碼的GL _LI NE_STRIP 參數(shù)該為GL _LI NE_LOOP,那么將繪制出三條線段:線段AB、BC和CA 。四邊形(QUA D 也屬于使用幾率較高的圖元。只要把gl B

16、 egin 的參數(shù)改為GL _QUAD S ,就可以繪制四邊形。把參數(shù)改為GL _POLYGO N ,則可以繪制一個多邊形。然而,仔細(xì)觀察你將發(fā)現(xiàn),無論是四邊形還是多邊形,只要花一點(diǎn)工夫,他們都可以使用三角形來表示。而且,由于現(xiàn)在的顯卡都對三角形的繪制做了大量的優(yōu)化,使得繪制三角形的速度比繪制多邊形的速度快得多。因此請盡量不要使用多邊形這種圖元以提高渲染速度。如果你要使用四邊形或多邊形,請注意以下幾點(diǎn):1.使用OpenGL 繪制的多邊形,必須是凸多邊形;2.繪制的多邊形的所有頂點(diǎn)都必須處在同一個平面上。由于這些限制,使得繪制多邊形這種圖元顯得不怎么方便。這也突出了使用三角形的優(yōu)點(diǎn)你永遠(yuǎn)也不用擔(dān)

17、心繪制出來的三角形是無效的。你可以盡情地使用三角形繪制各種復(fù)雜多邊形。3.3 使用深度測試我們知道,當(dāng)一個平面或物體擋住了另一個物體時,后面的物體是不可見的。此時,我們應(yīng)該避免繪制后面的物體。這個時候,我們可以使用OpenGL 的一個功能:深度測試(Depth T est ,也稱深度緩沖(z -Buff er來剔除這些被擋住的表面。深度測試就是在繪制像素時,計算該像素所代表的物體離觀察者的距離,稱為z 值。如果該值在同一個像素上所有的z 值中是最小的,就繪制該像素,否則就跳過。這是一個解決深度問題的有效方法。我們只需要調(diào)用函數(shù) glEnable(GL_DEPTH_TEST;就可以開啟深度測試。

18、調(diào)用glDisable(GL_DEPTH_TEST;關(guān)閉深度測試。3.4 背面剔除如果你將要繪制一些實(shí)心的物體,那么這個實(shí)心物體內(nèi)部的表面將永遠(yuǎn)是不可見的。而OpenGL 并不知道這些面不可見,它會照樣對他們進(jìn)行計算和繪制。雖然最后還是沒有將這些背面繪制在屏幕上,但是浪費(fèi)了許多不必要的時間。因此,我們應(yīng)該開啟背面隱藏功能剔除這些不可見的表面。繞法如果我們把一個物體朝著外面的表面都按照逆時針的順序傳給OpenGL,那么OpenGL 就會認(rèn)為這個面是朝外面的。這個時候,我們開啟背面剔除就不會有什么影響。但如果你沒有遵守這個規(guī)定就開啟了背面剔除,將得不到正確的渲染結(jié)果。我們可以通過函數(shù)gl F ront Fac e 的調(diào)用來改變這一規(guī)則。例如:glFrontFace(GL_CCW;將讓OpenGL 認(rèn)為所有逆時針纏繞的表面是正面,如果把 GL_CCW 改為 GL_CW ,那么OpenGL 將認(rèn)為所有逆時針纏繞的面是正面。開啟表面剔除在渲染之前,添加下面的代碼來打開表面剔除:glCullFace(GL_BACK;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論