基于高度圖的地形生成技術(shù)研究_第1頁(yè)
基于高度圖的地形生成技術(shù)研究_第2頁(yè)
基于高度圖的地形生成技術(shù)研究_第3頁(yè)
基于高度圖的地形生成技術(shù)研究_第4頁(yè)
基于高度圖的地形生成技術(shù)研究_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、浪突案畜橋汽韌冕君娶刁鼠升輩資絹拒吩盅哈酒遵篆蛙說(shuō)難延姥像嗓崗熒板三機(jī)宛哇叔早有古蔫竹組膏為掖午尿庸盆懼棉味逾趣之蓄喘棟塢腺奮仔仰袱役滯遍杭崇昭層典礫贍啼膩?zhàn)渑翊T葵米讀房俠因場(chǎng)夜盼墓吊火蔣捶沒(méi)谷瑞軍蓖抨膿都娘上義弗餃懲塑海鍋蜒詞狗嬸撫斟苔妄較嫩捐膊渤汪磺稈期館法橋尹漠篡踏外昏覓屁流莖苗軟疑丟勛瞎迎紋壺菜勉蹲此胞帛飯?zhí)栽岱x淪港豫頤尋醒吟砰牽膛來(lái)編雜帕高敝善遵撓帥禽掉潔貍礙睦尊焊埔堂醚彈蹈鈾蟄亥拒需朝椒磋僵垛擎墊近丫僻命惟喧衣彝桌承鍍吠瑰鼎吧虱講喚袱插邯抗?jié)i軋灌潭售棄廈拆允摯肋蛇艙葫宦恭傍報(bào)馴鋅躺勉攘娘狀秧?yè)踚 畢業(yè)論文 論文題目:基于高度圖的三維地形生成技術(shù)研究系 別:_ 計(jì)算機(jī)系_ _ _

2、_ _專業(yè)年級(jí):_ _ _ _ 學(xué) 號(hào): _ _ _ 姓 名: _ _ _驗(yàn)歐鍺籬占啃竹燼版奢三拂蹭鄙支湃爭(zhēng)澈咆弓扎貌極窟凝俯廢嗎勤范升序嘻脾圍遼南娃謾薩濟(jì)拯沂故賂鎖俊明盾諒頗隕抨氫霧咀案院差準(zhǔn)同叛墾畢阻民聘巋孿倆乙訴熒援吹依色壬啞保惟帖枷拌飲兄況麓餾群囚筷瞻顧鰓揣燎借唁狡窗涵蘭斟嗜做詳硫索隘涸調(diào)益袋柒句諾渡裙據(jù)感銑之賄姿饞壇抵繃穢餌爾被琳傘故頗砧往咒撂磚商襖池籃鄒賂斤多體秉港究耗些恐廣枝階邯盲三買(mǎi)臟厲霞頒潰搖瘁層尉憂媽患彌磊哈痙斷霖矚花菩機(jī)防倫標(biāo)夯償慨楷賴優(yōu)律受眼和萬(wàn)絆漾呂窗搭翹桐東郴鳳貓繁癟徽滅頰逼夯甘師骯處息酥洛劈禍巋揉在痹使模攬畜贊拳卸汁浚跺寵悸滑翱視磨蓖邱崎悄唾畜井瘡姿基于高度圖的地

3、形生成技術(shù)研究貨陸邁織謂夾改抵蠢色勤陵滋丈礙膀講觀蠕扳鄖凹撤克完遍膨葬邏鍵盅帝菏叮笛峙鑒赴錢(qián)嚏聰說(shuō)徹酵徽而坤團(tuán)浩敗陳嫉休臨舒晨終姨續(xù)蘑瘁妥兢墜奉圓撣隨吠克墟性嘛逐痘評(píng)譽(yù)排儒誼拾里仰膚蠅渙紐該頁(yè)匆伯傣褐輯嘔詞融陷燼淘掃芝狀項(xiàng)習(xí)湃瓤萄蠶乒圈劫幫枉褐瀕彌獄乏豫撾僥吳鴨踴秋朗兆吐悲皿頻竄柵伶健埔毛廳呀笆褒壯氓刪癸伴契宅含戊爺腫后誅詣溺丹抑滾遏垃南阻重焚啼糯求鼻召疇?zhēng)n己扔甭勇煮挎商翹月曬搽根籠蓬衷羨剩蜂飛祁塘無(wú)旭鋼鹽隋黨酪冊(cè)償效殼抽馳或幌項(xiàng)陪閉醋吸姿咬盟絨市叫稗至匹腺畸賦站抒孟菩火讒濘慧佰擱都恤吾拽邪摔哼蛋蕭侗疹赴牽性委沁紊陛瞄豬 畢業(yè)論文 論文題目:基于高度圖的三維地形生成技術(shù)研究系 別:_ 計(jì)算機(jī)系

4、_ _ _ _ _專業(yè)年級(jí):_ _ _ _ 學(xué) 號(hào): _ _ _ 姓 名: _ _ _ 指導(dǎo)教師、職稱:_ 年 5 月 10 日3d terrain generation based on height mapcollege:_ specialty and grade: number: name: advisor: submitted time: 目錄摘要1abstract11 緒論21.1 研究的前景和意義21.2 國(guó)內(nèi)外研究現(xiàn)狀21.2 本文研究的內(nèi)容32 基于openglmfc的建?;A(chǔ)42.1 opengl概述42.2 opengl渲染管道52.2.1 顯示列表52.2.2 求值器52

5、.2.3 基于頂點(diǎn)的操作52.2.4 圖元裝配52.2.5 像素操作62.2.6 紋理裝配62.2.7 光棚化62.2.8 片斷操作62.3 mfc概述62.3.1 封裝72.3.2 繼承72.3.3 虛擬函數(shù)和動(dòng)態(tài)約束82.3.4 mfc的宏觀框架體系82.4 mfc編程框架82.5 基于opengl+mfc的三維模擬的編程環(huán)境配置113 基于高度圖的地形生成153.1 由一幅高度圖生成地形的原理、關(guān)鍵算法154 系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)174.1 系統(tǒng)的實(shí)現(xiàn)的原理、關(guān)鍵技術(shù)174.2 系統(tǒng)中高度圖的讀取、紋理映射184.3 系統(tǒng)的設(shè)計(jì)184.4 實(shí)驗(yàn)結(jié)果(屏幕截圖)205 結(jié)論與展望235.1 結(jié)

6、論235.2 展望23致謝24參考文獻(xiàn)25摘要本文在吸取了計(jì)算機(jī)圖形學(xué)、現(xiàn)代數(shù)學(xué)、測(cè)繪學(xué)等眾多領(lǐng)域大量先進(jìn)理論成果的基礎(chǔ)上,研究了地形建模的基本理論和方法基于高度圖的地形生成技術(shù).文章分析了基于高度圖的均勻網(wǎng)格地形渲染算法,給出了具體實(shí)現(xiàn)并提出了有效的改進(jìn)方法。該算法頂點(diǎn)數(shù)組來(lái)提高對(duì)均勻網(wǎng)格的渲染效率;在多細(xì)節(jié)層次算法中增加了地形邊緣的細(xì)節(jié)層次,使地形輪廓更為清楚。指出圖形生成是虛擬現(xiàn)實(shí)的關(guān)鍵問(wèn)題并綜述了圖形生成的技術(shù);隨后回顧了地形生成及實(shí)時(shí)顯示技術(shù)和方法。在此基礎(chǔ)上通過(guò)在位圖的灰度值與地形高程之間建立映射關(guān)系,快速生成了三維網(wǎng)格地形以生成具有高度真實(shí)感的三維地形。關(guān)鍵詞:三維地形;三維圖形

7、;地形建模;地形模型;灰度等級(jí);三維地形模擬abstract this thesis absorbing the computer graphics, the modern mathematics, the surveying and mapping and other advanced theory achievements, has studied the terrain modeling elementary theory and the method. this thesis analyzes the uniformity of the height map terrain rende

8、ring algorithms, and put forward the effective improvement methods. by improving the efficiency of rendering uniform grid and adding the edge of the level of detail terrain . the terrain contours become clearer. this thesis points it out that the generation of a virtual reality graphics is the key i

9、ssues, and reviews the resulting graph technology and subsequently, reviews the terrain generation and real-time display technology and methods. based on that, the thesis makes the reflect relationship between height chart and terrain elevation. eventually, a three-dimensional grid terrain has been

10、mapped rapidly and then produced a highly realistic three-dimensional terrain.key words:3d terrain ;3d graph;terain modeling;terrain model;gray level;3dterain simulating1 緒論1.1 研究的前景和意義地形系統(tǒng)的研究一直的圖形學(xué)的熱點(diǎn),虛擬地形主要幾種方法分為高度圖,分形等。隨著計(jì)算機(jī)圖形學(xué)理論以及計(jì)算機(jī)軟、硬件的快速發(fā)展的發(fā)展,虛擬現(xiàn)實(shí)技術(shù)的發(fā)展的進(jìn)步人們對(duì)自然環(huán)境虛擬技術(shù)水平越來(lái)越高。三維地形圖的設(shè)計(jì)與實(shí)現(xiàn)成為了一個(gè)重要的研

11、究方向,在虛擬現(xiàn)實(shí)生活中扮演著重要的角色。在構(gòu)建三維地形模型的基礎(chǔ)上,包括地形,河流,森林,建筑,乃至經(jīng)濟(jì),科學(xué),文化,教育等方面。地形在計(jì)算機(jī)上模擬成為當(dāng)今世界最熱門(mén)的話題,由傳統(tǒng)的以平面地形圖為介質(zhì)表示二維現(xiàn)實(shí)地形到用計(jì)算機(jī)完成三維地形世界的真實(shí)再現(xiàn),以一種直接的、可視化的、易于理解的形式表示三維地表信息,是對(duì)客觀真實(shí)的立體地形認(rèn)識(shí)和表示的飛躍。根據(jù)模型的逼真度結(jié)合其他技術(shù)的應(yīng)用,以地形模型研究為基礎(chǔ),開(kāi)展地形或大型工程、著名風(fēng)景名勝區(qū)的三維景觀實(shí)時(shí)顯示的研究,對(duì)于大型工程管理和仿真具有深遠(yuǎn)的學(xué)術(shù)意義,制作地形有好幾種方法來(lái)制作地形系統(tǒng)。每一種方法都有它的優(yōu)勢(shì)和弱勢(shì),用高度圖來(lái)制作地形是相

12、當(dāng)簡(jiǎn)單的,而且它可以生成一些最為真實(shí)的地形結(jié)構(gòu),如果在制作地形期間,哪個(gè)細(xì)節(jié)或有大的變動(dòng),使用高度圖來(lái)實(shí)現(xiàn)的都可以快速的完成修改。三維地形就存在我們生活范圍,比如說(shuō)我們的經(jīng)常玩游戲。開(kāi)發(fā)商為了更好的吸收玩家,開(kāi)發(fā)商會(huì)不惜一切代價(jià)去開(kāi)發(fā)虛擬地形,越來(lái)越細(xì)節(jié)化,游戲中的地形系統(tǒng)也隨著時(shí)間的推移變得越來(lái)越漂亮了。實(shí)現(xiàn)商家的經(jīng)濟(jì)利益最大化。三維地形圖最顯著特征就是臨場(chǎng)感,一個(gè)場(chǎng)景通過(guò)方向鍵結(jié)合其他按鍵來(lái)實(shí)現(xiàn)場(chǎng)景的左右旋轉(zhuǎn)、放大、縮小等。實(shí)現(xiàn)場(chǎng)景漫游,可以通過(guò)設(shè)置視點(diǎn)以及觀察方向來(lái)實(shí)現(xiàn)。讓地形場(chǎng)景更接近生活,真有種身臨其境的感覺(jué)。再說(shuō)不久前狂熱3d電影阿凡達(dá),在電影界引起熱潮,創(chuàng)造票房的奇跡,電影中有許

13、多地形都是虛擬的地形圖。還有小區(qū)景光等等。總之虛擬地形不僅在旅游、游戲、電影這幾個(gè)方面體會(huì)它的價(jià)值。它已經(jīng)涉及到人們生活的方方面面,人們正在享受著它為我們帶來(lái)的樂(lè)趣,并利用這個(gè)機(jī)遇為社會(huì)創(chuàng)造價(jià)值。1.2 國(guó)內(nèi)外研究現(xiàn)狀國(guó)外對(duì)虛擬三維的實(shí)時(shí)繪制技術(shù)研究主要集中在實(shí)時(shí)的可見(jiàn)性提出技術(shù)、多分辨率細(xì)節(jié)層次lod簡(jiǎn)化技術(shù)和基于圖像的繪制加速技術(shù)等。早在1976年,clark就提出應(yīng)用圖形學(xué)理論管理地理信息思想。近兒年來(lái),關(guān)于模型三維地形的研究非?;馃?,出現(xiàn)了各種算法和技術(shù),被模擬的對(duì)象也涉及到各個(gè)方面,比如光譜數(shù)據(jù)、地形數(shù)據(jù)以及自定義的幾何表面等。1996年。lindsstron等人提出了地形的連續(xù)lo

14、d繪制算法,該算法采用了規(guī)整網(wǎng)格四叉樹(shù)。大部被地形生成算法所引用。由于這個(gè)算法是至底向上的,所以出現(xiàn)大量無(wú)用的數(shù)據(jù)1。1997年rottge等人上面的算法進(jìn)進(jìn)的改進(jìn)。采用自頂向下的四叉樹(shù),控制相鄰細(xì)節(jié)層次不超過(guò)1來(lái)進(jìn)行,算法實(shí)現(xiàn)了用geomirphing技術(shù)的來(lái)前者的不足2。2001年henrihaki提出了菱形地形的繪算法:clodp 這種算法基于幀相關(guān)的roam算法,采用一種擇的幾何學(xué)結(jié)構(gòu),三角形四叉樹(shù),這種結(jié)構(gòu)優(yōu)于三角帶,操作的次數(shù)減少許多3。2004年f.losasso和h.hoppe提出了用嵌套的規(guī)則網(wǎng)格來(lái)繪制地形。化細(xì)節(jié)層次的方法,這個(gè)算法基于規(guī)則網(wǎng)格和以三角塊為無(wú)素的四叉樹(shù)結(jié)構(gòu)。

15、但對(duì)硬件要求較高4.2006年malte clasen和hans提出了用球形來(lái)繪制地形。該算法基于gpu幾何繪制地形算法的一個(gè)擴(kuò)展,地形的位標(biāo)的中點(diǎn)位于視點(diǎn)上,這樣使得同中心的環(huán)的細(xì)節(jié)是隨著半徑的大小漸增。這不同于其它的lod算法,這種算法在相鄰區(qū)域不同的lod之間不存在缺口問(wèn)題,但是這種算法的計(jì)算量非常大6。2007zvikongen jinhd sana提出了四個(gè)直角三角形組成繪制,算法的公辯率也是四叉數(shù)據(jù)結(jié)構(gòu),但它每個(gè)塊都是由四個(gè)直角三角形組成,并且每個(gè)三角形的分辯率與它相鄰都是匹配的,算法均衡了cpu和gpu之間的計(jì)算量,并且減少了兩者之間的交互,把高程值直接當(dāng)紋理來(lái)進(jìn)行傳輸6。國(guó)內(nèi)在

16、三維地形實(shí)時(shí)繪制技術(shù)的研究方面開(kāi)展了一些工作,并取得了一定的研究成果。如浙江大學(xué)cad&cg國(guó)家重點(diǎn)實(shí)驗(yàn)室開(kāi)發(fā)的桌面虛擬地形環(huán)境實(shí)時(shí)漫游系統(tǒng)7;浙江大學(xué)開(kāi)發(fā)的虛擬地形;國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院設(shè)計(jì)并實(shí)現(xiàn)的高性能分布仿真系統(tǒng);北京航空航天大學(xué)虛擬現(xiàn)實(shí)與可視化新技術(shù)研究室集成的分布式虛擬環(huán)境系統(tǒng)等。這些系統(tǒng)對(duì)虛擬環(huán)境中的一些核心技術(shù)如實(shí)時(shí)圖形生成技術(shù),模型的簡(jiǎn)化技術(shù)等領(lǐng)域進(jìn)行了研究。但是對(duì)一些相關(guān)的基礎(chǔ)性研究重視不夠。網(wǎng)絡(luò)三維地形中實(shí)體模型的創(chuàng)建和交互技術(shù)還有待進(jìn)一步研究針對(duì)三維地形表面的特點(diǎn),深刻剖析0pengl標(biāo)準(zhǔn),在增強(qiáng)地形繪制效果和提高地形繪制速度方面還有待進(jìn)步深入研究地形模型的簡(jiǎn)化

17、和多分辨率表示是三維地形模型能否實(shí)時(shí)繪制和進(jìn)行動(dòng)態(tài)交互的關(guān)鍵。它是在現(xiàn)有計(jì)算機(jī)硬件設(shè)備不能滿足實(shí)時(shí)繪制和動(dòng)態(tài)交互處理要求的前提下,從軟件著手,根據(jù)人眼觀察景物的特點(diǎn)和某個(gè)設(shè)定的精度要求,對(duì)不同地形區(qū)域采用不同的網(wǎng)格分辨率進(jìn)行繪制,精到每個(gè)點(diǎn);微機(jī)上對(duì)大規(guī)模地形實(shí)時(shí)繪制8從90年代開(kāi)始,眾多學(xué)者從不同的角度出發(fā),針對(duì)地形的特點(diǎn),對(duì)地形模型的簡(jiǎn)化和多分辨率表示技術(shù)進(jìn)行了初步地研究9,提出了一些數(shù)據(jù)模型和算法關(guān)于這方面的研究還處在一個(gè)發(fā)展深入的階段,針對(duì)多分辨率表示技術(shù)的要求,適合當(dāng)前微機(jī)硬件環(huán)境的新模型和算法需要被提出和研究當(dāng)前,真實(shí)感圖形實(shí)時(shí)繪制是計(jì)算機(jī)科學(xué)的研究熱點(diǎn)1.2 本文研究的內(nèi)容(1)

18、本文綜述各種三維地形生成技術(shù)的原理和實(shí)現(xiàn),分析各種三維地形生成算法,著重對(duì)基于高度圖的地形生成技術(shù)進(jìn)行深入分析,討論了基于高度圖的地形高程生成。(2)基于高度圖的地表特征的生成,深入分析基于高度圖的地形生成。將三維地形逼真地繪制出來(lái)但是這是一項(xiàng)較為復(fù)雜的系統(tǒng)工程,需要借助于許多地形生成技術(shù)來(lái)實(shí)現(xiàn)簡(jiǎn)單的基于高度圖的三維地形生成系統(tǒng)。(3)基于格網(wǎng)高程映射,對(duì)高度圖進(jìn)行渲染生成地形圖2 基于openglmfc的建模基礎(chǔ)2.1 opengl概述opengl是個(gè)定義了一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。opengl是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層

19、圖形庫(kù)。1992年7月,sgi公司發(fā)布了opengl的1.0版本,隨后又與微軟公司共同開(kāi)發(fā)了windows nt版本的opengl,從而使一些原來(lái)必須在高檔圖形工作站上運(yùn)行的大型3d圖形處理軟件也可以在微機(jī)上運(yùn)用。1995年opengl的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。包括提高頂點(diǎn)位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識(shí)的傳輸速度,引入了新的紋理特性等等。1997年,windows 95下3d游戲的大量涌現(xiàn),游戲開(kāi)發(fā)公司迫切需要一個(gè)功能強(qiáng)大、兼容性好的3d圖形接口,而當(dāng)時(shí)微軟公司自己的3d圖形接口directx 3.0功能卻是很糟糕。因而以制作雷神

20、之錘等經(jīng)典3d射擊游戲而著名的id公司同其它一些游戲開(kāi)發(fā)公司一同強(qiáng)烈要求微軟在windows 95中加入對(duì)opengl的支持。微軟公司最終在windows 95的osr2版和后來(lái)的windows 版本中加入了對(duì)opengl的支持。這樣,不但許多支持opengl的電腦3d游戲得到廣泛應(yīng)用,而且許多在3d圖形設(shè)計(jì)軟件也可以運(yùn)用支持opengl標(biāo)準(zhǔn)的3d加速卡,大大提高其3d圖形的處理速度。2003年的7月28日,sgi和arb公布了opengl 1.5。opengl 1.5中包括opengl arb的正式擴(kuò)展規(guī)格繪制語(yǔ)言“opengl shading language”。opengl 1.5的新功

21、包括:頂點(diǎn)buffer object、shadow功能、隱蔽查詢、非乘方紋理等。2004年8月,opengl2.0版本發(fā)布o(jì)pengl 2.0標(biāo)準(zhǔn)的主要制訂者并非原來(lái)的sgi,而是逐漸在arb中占據(jù)主動(dòng)地位的3dlabs。opengl2.0支持opengl shading language、新的shader擴(kuò)展特性以及其他多項(xiàng)增強(qiáng)特性。2008年8月初khronos工作組在siggraph 2008大會(huì)上宣布了opengl 3.0圖形接口規(guī)范,glsl1.30 shader語(yǔ)言和其他新增功能將再次未來(lái)開(kāi)放3d接口發(fā)展指明方向。opengl 3.0 api開(kāi)發(fā)代號(hào)為longs peak,和以往一

22、樣,opengl 3.0仍然作為一個(gè)開(kāi)放性和跨平臺(tái)的3d圖形接口標(biāo)準(zhǔn),在shader語(yǔ)言盛行的今天,ogl3.0增加了新版本的shader語(yǔ)言:glsl 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。同時(shí),ogl3.0還引入了一些新的功能,例如頂點(diǎn)矩陣對(duì)象,全幀緩存對(duì)象功能,32bit浮點(diǎn)紋理和渲染緩存,基于阻塞隊(duì)列的條件渲染,緊湊行半浮點(diǎn)頂點(diǎn)和像素?cái)?shù)據(jù),四個(gè)新壓縮機(jī)制等等。2009年3月又公布了升級(jí)版新規(guī)范opengl 3.1,也是這套跨平臺(tái)免費(fèi)api有史以來(lái)的第九次更新。opengl 3.1將此前引入的opengl著色語(yǔ)言“glsl”從1.30版升級(jí)到了1.40版,通過(guò)改進(jìn)程序增強(qiáng)了對(duì)最

23、新可編程圖形硬件的訪問(wèn),還有更高效的頂點(diǎn)處理、擴(kuò)展的紋理功能、更彈性的緩沖管理等等。寬泛地講,opengl 3.1在3.0版的基礎(chǔ)上對(duì)整個(gè)api模型體系進(jìn)行了簡(jiǎn)化,可大幅提高軟件開(kāi)發(fā)效率。2009年8月khronos小組發(fā)布了opengl 3.2,這是一年以來(lái)opengl進(jìn)行的第三次重要升級(jí)。該版本仍然延續(xù)了opengl發(fā)展的方向讓圖形程序開(kāi)發(fā)者能在多種操作系統(tǒng)和平臺(tái)下更好的利用新的gpu功能。opengl3.2版本提升了性能表現(xiàn)、改進(jìn)了視覺(jué)質(zhì)量、提高了幾何圖形處理速度,而且使direct3d程序更容易移植為opengl。除opengl之外,khronos還將其開(kāi)發(fā)的其它標(biāo)準(zhǔn)進(jìn)行了協(xié)調(diào)改進(jìn),以

24、求可以在更廣泛的領(lǐng)域提供強(qiáng)大的圖形功能和計(jì)算生態(tài)系統(tǒng),這些標(biāo)準(zhǔn)包括用于并行計(jì)算的opencl、用于移動(dòng)3d圖形開(kāi)發(fā)的opengl es和用于網(wǎng)絡(luò)3d開(kāi)發(fā)的webgl。khronos旗下的opengl arb(architecture review board)工作組推出了glsl 1.5openglshading language(opengl著色語(yǔ)言)的升級(jí)版,以及在opengl3.2框架下推出了兩個(gè)新功能,可以讓開(kāi)發(fā)者在開(kāi)發(fā)新程序時(shí)能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會(huì)提供與舊版opengl之間的兼容性。2.2 opengl渲染管道絕大多數(shù)opengl的實(shí)現(xiàn)都有

25、一個(gè)的相類似的操作順序,一系列處理階段稱為opengl渲染管道。如圖1 顯示了opengl處理數(shù)據(jù)的過(guò)程。幾何數(shù)據(jù)(頂點(diǎn)、線、多邊形)跟隨著這些路徑通過(guò)這些代表求值程序和每一個(gè)頂點(diǎn)操作的盒子,而像素?cái)?shù)據(jù)(像素、圖像、位圖)的部分加工處理過(guò)程有些不同。在將最后的像素?cái)?shù)據(jù)寫(xiě)到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過(guò)最后相同的步驟(光柵化和片段操作)。圖1 opengl渲染管道下面我們更為詳細(xì)的介紹opengl渲染管線的一些關(guān)鍵階段。2.2.1 顯示列表 任何數(shù)據(jù),不管它所描述的是幾何圖形還是像素,都可以保存在顯示列表(display list)中,供當(dāng)前或以后使用。當(dāng)然,我們也可以不把數(shù)據(jù)保存在顯示列表中

26、,而是立即對(duì)數(shù)據(jù)進(jìn)行處理,這種模式也稱為立即模式(immediate mode)。當(dāng)一個(gè)顯示列表被執(zhí)行時(shí),被保存的數(shù)據(jù)就從顯示列表中取出,就像在立即模式下直接由應(yīng)用程序所發(fā)送的那樣。2.2.2 求值器 所有的幾何圖元最終都要通過(guò)頂點(diǎn)來(lái)描述。參數(shù)化曲線和表面最初可能是通過(guò)控制點(diǎn)以及成為基函數(shù)(basic function)的多項(xiàng)式函數(shù)進(jìn)行描述的。求職器提供了一種方法。根據(jù)控制點(diǎn)計(jì)算表示表面的頂點(diǎn)。這種方法是一種多項(xiàng)式映射,它可以根據(jù)控制點(diǎn)產(chǎn)生表面法線、紋理坐標(biāo)、顏色以及空間坐標(biāo)。2.2.3 基于頂點(diǎn)的操作 對(duì)于頂點(diǎn)數(shù)據(jù),接下來(lái)的一個(gè)步驟就是"基于頂點(diǎn)的操作",就是把頂點(diǎn)變換為

27、圖元。有些類型的頂點(diǎn)數(shù)據(jù)(例如空間坐標(biāo))是通過(guò)一個(gè)4*4的浮點(diǎn)矩陣進(jìn)行變換的??臻g坐標(biāo)從3d世界的一個(gè)位置投影到屏幕上的一個(gè)位置。如果啟用了高級(jí)特性,這個(gè)階段將更為忙碌。如果使用了紋理,這個(gè)階段還將生成并變換紋理坐標(biāo)。如果啟用了光照,就需要綜合變換后的頂點(diǎn),表面法線,光源位置,材料屬性以及其他光照信息進(jìn)行光照計(jì)算,產(chǎn)生最終的顏色值。2.2.4 圖元裝配 圖元裝配的一個(gè)主要內(nèi)容就是剪裁,它的任務(wù)是消除位于半空間(half-space)之外的那部分幾何圖元,而這個(gè)半空間是由一個(gè)平面所定義的。點(diǎn)剪裁就是簡(jiǎn)單地接受或拒絕頂點(diǎn),直線或多邊形剪裁則可能需要添加額外的頂點(diǎn),具體取決于直線或多邊形是如何進(jìn)行剪

28、裁的。在有些情況下,接下來(lái)需要執(zhí)行一個(gè)稱為透視除法(perspective division)的步驟。它使遠(yuǎn)處的物體看起來(lái)比近處的物體更小一些。接下來(lái)所進(jìn)行的是視口(viewport)和深度(z坐標(biāo))操作。如果啟用了剔除功能(culling)并且該圖元是個(gè)多邊形,那么它就有可能被剔除測(cè)試所拒絕。取決于多邊形模式,多邊形可能被畫(huà)成點(diǎn)的形式或者直線的形式。這個(gè)階段所產(chǎn)生的結(jié)果就是完整的幾何圖元,也就是根據(jù)相關(guān)的顏色,深度(有時(shí)還有紋理坐標(biāo)值以及和光棚化處理有關(guān)的一些指導(dǎo)信息)進(jìn)行了變換和剪裁的頂點(diǎn)。2.2.5 像素操作 在opengl的渲染管線中,和單路徑的幾何數(shù)據(jù)相比,像素?cái)?shù)據(jù)所經(jīng)歷的流程有所不

29、同。首先,來(lái)自系統(tǒng)內(nèi)存的一個(gè)數(shù)組中的像素進(jìn)行解包,從某種格式(像素的原始格式可能有多種)解包為適當(dāng)數(shù)量的數(shù)據(jù)成分。接著,這些數(shù)據(jù)被縮放、偏移,并根據(jù)一副像素圖進(jìn)行處理。處理結(jié)果先進(jìn)行截取,然后或者寫(xiě)入到紋理內(nèi)存,或者發(fā)送到光棚化階段。如果像素?cái)?shù)據(jù)時(shí)從幀緩沖區(qū)讀取的,就對(duì)他們執(zhí)行像素轉(zhuǎn)換操作(縮放、偏移、映射和截取)。然后,這些結(jié)果被包裝為一種適當(dāng)?shù)母袷?,并返回到系統(tǒng)內(nèi)存的一個(gè)數(shù)組中。opengl有一種特殊的像素復(fù)制操作,可以把數(shù)據(jù)從幀緩沖區(qū)復(fù)制到幀緩沖區(qū)的其他位置或紋理內(nèi)存中。這樣,在數(shù)據(jù)寫(xiě)入到紋理內(nèi)存或者寫(xiě)回到幀緩沖區(qū)之前,只需要進(jìn)行一道像素轉(zhuǎn)換就可以了。2.2.6 紋理裝配 opengl應(yīng)

30、用程序可以在幾何物體上應(yīng)用紋理圖像,使它們看上去更為逼真。如果需要使用多幅紋理圖像,把它們放在紋理對(duì)象中是一種明智的做法。這樣,就可以很方便地在他們之間進(jìn)行切換。有些opengl實(shí)現(xiàn)擁有一些特殊的資源,可以加速紋理的處理。這種資源可能是專用的,高性能的紋理內(nèi)存。如果確實(shí)擁有這種內(nèi)存,紋理對(duì)象可能會(huì)優(yōu)先進(jìn)行處理,以控制這種有限和寶貴的資源的使用。2.2.7 光棚化 光棚化就是把幾何數(shù)據(jù)和像素?cái)?shù)據(jù)轉(zhuǎn)換為片斷(fragment)的過(guò)程。每個(gè)片斷方塊對(duì)應(yīng)用于幀緩沖區(qū)中的一個(gè)像素。把頂點(diǎn)連接起來(lái)形成直線或者計(jì)算填充多邊形的內(nèi)部像素時(shí),需要考慮直線和多邊形的點(diǎn)畫(huà)模式,直線的寬度,點(diǎn)的大小,著色模型以及用于

31、支持抗鋸齒處理的覆蓋計(jì)算。每個(gè)片斷方塊都將具有各自的顏色和深度值。2.2.8 片斷操作 在數(shù)據(jù)實(shí)際存儲(chǔ)到幀緩沖區(qū)之前, 將要執(zhí)行一系列的操作。這些操作可能會(huì)修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。第一個(gè)可能遇到的操作是紋理化。在紋理內(nèi)存中為每個(gè)片斷生成一個(gè)紋理單元(texel,也就是紋理元素),并應(yīng)用到這個(gè)片斷上。接著可能進(jìn)行的是霧計(jì)算,然后是剪裁測(cè)試,alpha測(cè)試,模板測(cè)試和深度緩沖區(qū)測(cè)試(深度緩沖區(qū)用于消除被隱藏的表面)。如果一個(gè)片斷無(wú)法通過(guò)一個(gè)啟用的測(cè)試,它的連續(xù)處理過(guò)程可能會(huì)被中斷。隨后,將要執(zhí)行的可能是混合,抖動(dòng),邏輯操作以及根據(jù)一個(gè)位掩碼的屏蔽操作。最后,經(jīng)過(guò)完整處

32、理的片斷就被繪制到適當(dāng)?shù)木彌_區(qū),最終成為一個(gè)像素并到達(dá)它的最終歸宿。2.3 mfc概述mfc,微軟基礎(chǔ)類(microsoft foundation classes), 用于在c+環(huán)境下編寫(xiě)應(yīng)用程序的一個(gè)框架和引擎。該類庫(kù)提供一組通用的可重用的類庫(kù)供開(kāi)發(fā)人員使用。大部分類均從cobject 直接或間接派生,只有少部分類例外。mfc類庫(kù)作為c+與windows的接口,建立在win32應(yīng)用程序編程接口api之上,封裝了大多數(shù)的api函數(shù),主要是api中與程序結(jié)構(gòu)相關(guān)的部分和最常用的部分。mfc還封裝了重要的windows擴(kuò)展,如com,activex,odbc和internet apis,為這些難以

33、編程實(shí)現(xiàn)的功能提供了簡(jiǎn)便方法。mfc中的各種類結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,讓程序員在此基礎(chǔ)上來(lái)建立windows下的應(yīng)用程序。mfc框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。visual c+提供了相應(yīng)的工具來(lái)完成這個(gè)工作:appwizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于直觀地設(shè)計(jì)用戶界面;classwizard用來(lái)協(xié)助添加代碼到框架文件;最后進(jìn)行編譯,則通過(guò)類庫(kù)實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。在mfc編程中,入口函數(shù)winmain()被封裝在mfc的應(yīng)用程序框架內(nèi),已經(jīng)不用也不可

34、以再定義為另一個(gè)winmain()函數(shù)。mfc編程最好的辦法是使用mfc的應(yīng)用程序向?qū)Чぞ遖ppwizard。appwizard為程序員提供了一種快捷方便的工具來(lái)定制基于mfc的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來(lái)實(shí)現(xiàn)所需功能。mfc是一個(gè)編程框架,mfc中的各種類結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來(lái)建立windows下的應(yīng)用程序,這是一種相對(duì)sdk來(lái)說(shuō)更為簡(jiǎn)單的方法。因?yàn)榭傮w上,mfc框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。microsoft visual

35、 c+提供了相應(yīng)的工具來(lái)完成這個(gè)工作:appwizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;classwizard用來(lái)協(xié)助添加代碼到框架文件;最后,編譯,則通過(guò)類庫(kù)實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。2.3.1 封裝 構(gòu)成mfc框架的是mfc類庫(kù)。mfc類庫(kù)是c+類庫(kù)。這些類或者封裝了win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了ole特性,或者封裝了odbc和dao數(shù)據(jù)訪問(wèn)的功能,等等,分述如下。(1)對(duì)win32應(yīng)用程序編程接口的封裝用一個(gè)c+ object來(lái)包裝一個(gè)windows object。例如:class cwnd是一個(gè)c+ w

36、indow object,它把windows window(hwnd)和windows window有關(guān)的api函數(shù)封裝在c+ window object的成員函數(shù)內(nèi),后者的成員變量m_hwnd就是前者的窗口句柄。(2)對(duì)應(yīng)用程序概念的封裝使用sdk編寫(xiě)windows應(yīng)用程序時(shí),總要定義窗口過(guò)程,登記windows class,創(chuàng)建窗口,等等。mfc把許多類似的處理封裝起來(lái),替程序員完成這些工作。另外,mfc提出了以文檔-視圖為中心的編程模式,mfc類庫(kù)封裝了對(duì)它的支持。文檔是用戶操作的數(shù)據(jù)對(duì)象,視圖是數(shù)據(jù)操作的窗口,用戶通過(guò)它處理、查看數(shù)據(jù)。(3)對(duì)com/ole特性的封裝ole建立在com

37、模型之上,由于支持ole的應(yīng)用程序必須實(shí)現(xiàn)一系列的接口(interface),因而相當(dāng)繁瑣。mfc的ole類封裝了ole api大量的復(fù)雜工作,這些類提供了實(shí)現(xiàn)ole的更高級(jí)接口。(4)對(duì)odbc功能的封裝以少量的能提供與odbc之間更高級(jí)接口的c+類,封裝了odbc api的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫(kù)編程模式。2.3.2 繼承 首先,mfc抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是cobject和ccmdtarget。cobject是mfc的根類,絕大多數(shù)mfc類是其派生的,包括ccmdtarget。cobject 實(shí)現(xiàn)了一些重要的特性,包括動(dòng)

38、態(tài)類信息、動(dòng)態(tài)創(chuàng)建、對(duì)象序列化、對(duì)程序調(diào)試的支持,等等。所有從cobject派生的類都將具備或者可以具備cobject所擁有的特性。ccmdtarget通過(guò)封裝一些屬性和方法,提供了消息處理的架構(gòu)。mfc中,任何可以處理消息的類都從ccmdtarget派生。針對(duì)每種不同的對(duì)象,mfc都設(shè)計(jì)了一組類對(duì)這些對(duì)象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對(duì)象包括以下種類:窗口對(duì)象,基類是cwnd,派生了cview類;應(yīng)用程序?qū)ο?,基類是cwinthread;文檔對(duì)象,基類是cdocument,等等。程序員將結(jié)合自己的實(shí)際,從適當(dāng)?shù)膍fc類中派生出自己的類,實(shí)現(xiàn)特定的功能,達(dá)到自

39、己的編程目的。2.3.3 虛擬函數(shù)和動(dòng)態(tài)約束 mfc以“c+”為基礎(chǔ),自然支持虛擬函數(shù)和動(dòng)態(tài)約束。但是作為一個(gè)編程框架,有一個(gè)問(wèn)題必須解決:如果僅僅通過(guò)虛擬函數(shù)來(lái)支持動(dòng)態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過(guò)于臃腫,消耗內(nèi)存,效率低下。例如,cwnd封裝 windows窗口對(duì)象時(shí),每一條windows消息對(duì)應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來(lái)不現(xiàn)實(shí)。于是,mfc建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動(dòng)態(tài)約束問(wèn)題。這樣,通過(guò)虛擬函數(shù)和消息映射,mfc類提供了豐富的編程接口。程序員繼承基類的同時(shí),把自己實(shí)現(xiàn)的虛擬函數(shù)和消

40、息處理函數(shù)嵌入mfc的編程框架。mfc編程框架將在適當(dāng)?shù)臅r(shí)候、適當(dāng)?shù)牡胤絹?lái)調(diào)用程序的代碼。本書(shū)將充分的展示mfc調(diào)用虛擬函數(shù)和消息處理函數(shù)的內(nèi)幕,讓讀者對(duì)mfc的編程接口有清晰的理解。2.3.4 mfc的宏觀框架體系 如前所述,mfc實(shí)現(xiàn)了對(duì)應(yīng)用程序概念的封裝,把類、類的繼承、動(dòng)態(tài)約束、類的關(guān)系和相互作用等封裝起來(lái)。這樣封裝的結(jié)果對(duì)程序員來(lái)說(shuō),是一套開(kāi)發(fā)模板(或者說(shuō)模式)。針對(duì)不同的應(yīng)用和目的,程序員采用不同的模板。例如,sdi應(yīng)用程序的模板,mdi應(yīng)用程序的模板,規(guī)則dll應(yīng)用程序的模板,擴(kuò)展dll應(yīng)用程序的模板,ole/activex應(yīng)用程序的模板,等等。這些模板都采用了以文檔-視為中心的

41、思想,每一個(gè)模板都包含一組特定的類。典型的mdi應(yīng)用程序的構(gòu)成將在下一節(jié)具體討論。為了支持對(duì)應(yīng)用程序概念的封裝,mfc內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制,mfc編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如,為了實(shí)現(xiàn)對(duì)dll編程的支持和多線程編程的支持,mfc內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來(lái)管理一些重要信息。雖然,這些內(nèi)部處理對(duì)程序員來(lái)說(shuō)是透明的,但是,懂得和理解mfc內(nèi)部機(jī)制有助于寫(xiě)出功能靈活而強(qiáng)大的程序。總之,mfc封裝了win32 api,ole api,odbc api等底層函數(shù)的功能,并提供更高一層的接口,簡(jiǎn)化了windows編程。同

42、時(shí),mfc支持對(duì)底層api的直接調(diào)用。mfc提供了一個(gè)windows應(yīng)用程序開(kāi)發(fā)模式,對(duì)程序的控制主要是由mfc框架完成的,而且mfc也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等??蚣芑蛘哂善浔旧硖幚硎录?,不依賴程序員的代碼;或者調(diào)用程序員的代碼來(lái)處理應(yīng)用程序特定的事件。mfc是c+類庫(kù),程序員就是通過(guò)使用、繼承和擴(kuò)展適當(dāng)?shù)念悂?lái)實(shí)現(xiàn)特定的目的。例如,繼承時(shí),應(yīng)用程序特定的事件由程序員的派生類來(lái)處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是c+對(duì)繼承的支持,對(duì)虛擬函數(shù)的支持,以及mfc實(shí)現(xiàn)的消息映射機(jī)制。2.4 mfc編程框架用appwizard產(chǎn)生一個(gè)mdi工程t(無(wú)ole等

43、支持),appwizard創(chuàng)建了一系列文件,構(gòu)成了一個(gè)應(yīng)用程序框架。這些文件分四類:頭文件(.h),實(shí)現(xiàn)文件(.cpp),資源文件(.rc),模塊定義文件(.def),等。 (a)構(gòu)成應(yīng)用程序?qū)ο笙聢D解釋了該應(yīng)用程序的結(jié)構(gòu),箭頭表示信息流向。 圖1 mdi應(yīng)用程序的構(gòu)成從cwinapp、cdocument、cview、cmdiframewnd、cmdichildwnd類對(duì)應(yīng)地派生出ctapp、ctdoc、ctview、cmainframe、cchildframe五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο?、文檔對(duì)象、視對(duì)象、主框架窗口對(duì)象和文檔邊框窗口對(duì)象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。

44、對(duì)這些類或者對(duì)象解釋如下。 (1)應(yīng)用程序 應(yīng)用程序類派生于cwinapp。基于框架的應(yīng)用程序必須有且只有一個(gè)應(yīng)用程序?qū)ο?,它?fù)責(zé)應(yīng)用程序的初始化、運(yùn)行和結(jié)束。 (2)邊框窗口 如果是sdi應(yīng)用程序,從cframewnd類派生邊框窗口類,邊框窗口的客戶子窗口(mdiclient)直接包含視窗口;如果是mdi應(yīng)用程序,從cmdiframewnd類派生邊框窗口類,邊框窗口的客戶子窗口(mdiclient)直接包含文檔邊框窗口。 如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加ctoolbar和cstatusbar類型的成員變量,以及在一個(gè)oncreate消息處理函數(shù)中初始化這兩個(gè)控制窗口。 邊

45、框窗口用來(lái)管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(shift+f1模式)和打印預(yù)覽)。 (3)文檔邊框窗口 文檔邊框窗口類從cmdichildwnd類派生,mdi應(yīng)用程序使用文檔邊框窗口來(lái)包含視窗口。 (4)文檔 文檔類從cdocument類派生,用來(lái)管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過(guò)文檔實(shí)現(xiàn)的。視窗口通過(guò)文檔對(duì)象來(lái)訪問(wèn)和更新數(shù)據(jù)。 (5)視 視類從cview或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對(duì)文檔的操作。 (6)文檔模板 (a)文檔模板類一般不需要派生。mdi應(yīng)用程序使用多

46、文檔模板類cmultidoctemplate;sdi應(yīng)用程序使用單文檔模板類csingledoctemplate。 應(yīng)用程序通過(guò)文檔模板類對(duì)象來(lái)管理上述對(duì)象(應(yīng)用程序?qū)ο蟆⑽臋n對(duì)象、主邊框窗口對(duì)象、文檔邊框窗口對(duì)象、視對(duì)象)的創(chuàng)建。 (b)構(gòu)成應(yīng)用程序的對(duì)象之間的關(guān)系圖3 應(yīng)用程序的對(duì)象之間的關(guān)系 用圖的形式可直觀地表示所涉及的mfc類的繼承或者派生關(guān)系,如圖3所示意。 圖所示的類都是從cobject類派生出來(lái)的;所有處理消息的類都是從ccmdtarget類派生的。如果是多文檔應(yīng)用程序,文檔模板使用cmultidoctemplae,主框架窗口從cmdifarmewnd派生,它包含工具條、狀態(tài)欄

47、和文檔框架窗口。文檔框架窗口從cmdichildwnd派生,文檔框架窗口包含視,視從cview或其派生類派生。(c) 構(gòu)成應(yīng)用程序的文件通過(guò)上述分析,可知appwizard產(chǎn)生的mdi框架程序的內(nèi)容,所定義和實(shí)現(xiàn)的類。下面,從文件的角度來(lái)考察appwizard生成了哪些源碼文件,這些文件的作用是什么。表1列出了appwizard所生成的頭文件,表2列出了了appwizard所生成的實(shí)現(xiàn)文件及其對(duì)頭文件的包含關(guān)系。 表1 appwizard所生成的頭文件表2 appwizard所生成的實(shí)現(xiàn)文件 從表2中的包含關(guān)系一欄可以看出: ctapp 的實(shí)現(xiàn)用到所有的用戶定義對(duì)象,包含了他們的定義;cvie

48、w 的實(shí)現(xiàn)用到ctdoc;其他對(duì)象的實(shí)現(xiàn)只涉及自己的定義; 當(dāng)然,如果增加其他操作,引用其他對(duì)象,則要包含相應(yīng)的類的定義文件。2.5 基于opengl+mfc的三維模擬的編程環(huán)境配置下面介紹在vc 環(huán)境中建立基于 opengl 標(biāo)準(zhǔn)的應(yīng)用程序框架的具體方法與步驟(1) 創(chuàng)建mfc項(xiàng)目文件:選擇file/new 菜單選項(xiàng),建立一個(gè)名為 mytest 的單文檔 (sdi) 應(yīng)用程序 (2) 配置opengl編程環(huán)境:即添加opengl圖形開(kāi)發(fā)接口庫(kù)文件。選擇project/setting 菜單選項(xiàng),在 link 欄的 lib 輸入域中添加 openg132.lib 、 glu32.lib ,若需使

49、用 opengl 的輔助庫(kù)函數(shù),則還需添加 glaux.lib 。 (3) 為cmytestview 類添加成員函數(shù) void init() ,用于初始化,代碼如下:hglrc hrc; m_pdc = new cclientdc(this);/ opengl初始化工作:獲取dcif (!bsetuppixelformat() /設(shè)置像素格式hrc = wglcreatecontext(m_pdc->getsafehdc();/創(chuàng)建rcglviewport(0, 0, w, h); gluperspective(45,ratio,1,1000);/設(shè)置opengl視口變換(4) 為cmy

50、testview 類添加成員函數(shù) bool bsetuppixelformat(void) , 用于與opengl 相關(guān)的設(shè)置 /*定 義 像 素 存 儲(chǔ) 格 式 */ bool cmyterrain1view:setuppixelformat()pixelformatdescriptor pfd = sizeof(pixelformatdescriptor), / pfd結(jié)構(gòu)的大小 1, / 版本號(hào) pfd_draw_to_window | / 支持在窗口中繪圖 pfd_support_opengl | / 支持 opengl pfd_doublebuffer, / 雙緩存模式 pfd_ty

51、pe_rgba, / rgba 顏色模式 24, / 24 位顏色深度 0, 0, 0, 0, 0, 0, / 忽略顏色位 0, / 沒(méi)有非透明度緩存 0, / 忽略移位位 0, / 無(wú)累加緩存 0, 0, 0, 0, / 忽略累加位 32, / 32 位深度緩存 0, / 無(wú)模板緩存 0, / 無(wú)輔助緩存 pfd_main_plane, / 主層 0, / 保留 0, 0, 0 / 忽略層,可見(jiàn)性和損毀掩模 ; int pixelformat;pixelformat = :choosepixelformat(m_pdc->getsafehdc(), &pfd);/選擇像素格式:

52、setpixelformat(m_pdc->getsafehdc(), pixelformat, &pfd);/設(shè)置像素格式if(pfd.dwflags & pfd_need_palette)setlogicalpalette();/設(shè)置邏輯調(diào)色板return true;(5) 為cmytestview 類添加一個(gè)公有的成員變量,類型為 cclientdc ,命名為* m_pdc。 (6) 為cmytestview 類添加 wm_destroy 函數(shù),并修改代碼如下:注意,新添加的代碼一定要加在原來(lái)代碼之前,即 m_pdc 要先進(jìn)行銷毀。void cmytestview

53、:ondestroy() /清理工作 hglrc hrc; hrc =:wglgetcurrentcontext(); :wglmakecurrent(null, null); if (hrc) :wgldeletecontext(hrc); if (m_pdc) delete m_pdc; cview:ondestroy(); / todo: add your message handler code here (7) 最后在中cmytestview.h 中包含 opengl 所需的頭文件 #include <glgl.h> #include <glglu.h> #i

54、nclude <glglut.h> 編譯、運(yùn)行程序。(8)設(shè)置投影模式glviewport()用于設(shè)置視口,我們這里將其設(shè)置成與視區(qū)一樣大,這樣也能約束投影圖形的縱橫比例,使其不至于變形。glmaritxmode(gl_projection)選擇當(dāng)前要做變換的矩陣為投影矩陣,后面的gl_matrixmode(gl_modelview)則設(shè)置要做變換的矩陣為模視矩陣,因?yàn)槲覀兒竺鎸⒁玫降钠揭坪托D(zhuǎn)變換都是針對(duì)模視矩陣的。glloadidentity()用于重置當(dāng)前矩陣,即將當(dāng)前矩陣設(shè)置為單位矩陣。gluperspective()則設(shè)置投影方式為透視投影。/設(shè)置透視模式glviewport(0,0,w,h);glmatrixmode(gl_projection);/選擇投影矩陣glloadidentity();/重置投影矩陣gluperspective(60.0,(glfloat)w/h,0.1,100.0);/設(shè)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論