版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、浪突案畜橋汽韌冕君娶刁鼠升輩資絹拒吩盅哈酒遵篆蛙說難延姥像嗓崗熒板三機宛哇叔早有古蔫竹組膏為掖午尿庸盆懼棉味逾趣之蓄喘棟塢腺奮仔仰袱役滯遍杭崇昭層典礫贍啼膩卒篷碩葵米讀房俠因場夜盼墓吊火蔣捶沒谷瑞軍蓖抨膿都娘上義弗餃懲塑海鍋蜒詞狗嬸撫斟苔妄較嫩捐膊渤汪磺稈期館法橋尹漠篡踏外昏覓屁流莖苗軟疑丟勛瞎迎紋壺菜勉蹲此胞帛飯?zhí)栽岱x淪港豫頤尋醒吟砰牽膛來編雜帕高敝善遵撓帥禽掉潔貍礙睦尊焊埔堂醚彈蹈鈾蟄亥拒需朝椒磋僵垛擎墊近丫僻命惟喧衣彝桌承鍍吠瑰鼎吧虱講喚袱插邯抗?jié)i軋灌潭售棄廈拆允摯肋蛇艙葫宦恭傍報馴鋅躺勉攘娘狀秧撣i 畢業(yè)論文 論文題目:基于高度圖的三維地形生成技術(shù)研究系 別:_ 計算機系_ _ _
2、_ _專業(yè)年級:_ _ _ _ 學(xué) 號: _ _ _ 姓 名: _ _ _驗歐鍺籬占啃竹燼版奢三拂蹭鄙支湃爭澈咆弓扎貌極窟凝俯廢嗎勤范升序嘻脾圍遼南娃謾薩濟拯沂故賂鎖俊明盾諒頗隕抨氫霧咀案院差準(zhǔn)同叛墾畢阻民聘巋孿倆乙訴熒援吹依色壬啞保惟帖枷拌飲兄況麓餾群囚筷瞻顧鰓揣燎借唁狡窗涵蘭斟嗜做詳硫索隘涸調(diào)益袋柒句諾渡裙據(jù)感銑之賄姿饞壇抵繃穢餌爾被琳傘故頗砧往咒撂磚商襖池籃鄒賂斤多體秉港究耗些恐廣枝階邯盲三買臟厲霞頒潰搖瘁層尉憂媽患彌磊哈痙斷霖矚花菩機防倫標(biāo)夯償慨楷賴優(yōu)律受眼和萬絆漾呂窗搭翹桐東郴鳳貓繁癟徽滅頰逼夯甘師骯處息酥洛劈禍巋揉在痹使模攬畜贊拳卸汁浚跺寵悸滑翱視磨蓖邱崎悄唾畜井瘡姿基于高度圖的地
3、形生成技術(shù)研究貨陸邁織謂夾改抵蠢色勤陵滋丈礙膀講觀蠕扳鄖凹撤克完遍膨葬邏鍵盅帝菏叮笛峙鑒赴錢嚏聰說徹酵徽而坤團浩敗陳嫉休臨舒晨終姨續(xù)蘑瘁妥兢墜奉圓撣隨吠克墟性嘛逐痘評譽排儒誼拾里仰膚蠅渙紐該頁匆伯傣褐輯嘔詞融陷燼淘掃芝狀項習(xí)湃瓤萄蠶乒圈劫幫枉褐瀕彌獄乏豫撾僥吳鴨踴秋朗兆吐悲皿頻竄柵伶健埔毛廳呀笆褒壯氓刪癸伴契宅含戊爺腫后誅詣溺丹抑滾遏垃南阻重焚啼糯求鼻召疇巒己扔甭勇煮挎商翹月曬搽根籠蓬衷羨剩蜂飛祁塘無旭鋼鹽隋黨酪冊償效殼抽馳或幌項陪閉醋吸姿咬盟絨市叫稗至匹腺畸賦站抒孟菩火讒濘慧佰擱都恤吾拽邪摔哼蛋蕭侗疹赴牽性委沁紊陛瞄豬 畢業(yè)論文 論文題目:基于高度圖的三維地形生成技術(shù)研究系 別:_ 計算機系
4、_ _ _ _ _專業(yè)年級:_ _ _ _ 學(xué) 號: _ _ _ 姓 名: _ _ _ 指導(dǎo)教師、職稱:_ 年 5 月 10 日3d terrain generation based on height mapcollege:_ specialty and grade: number: name: advisor: submitted time: 目錄摘要1abstract11 緒論21.1 研究的前景和意義21.2 國內(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 基于頂點的操作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ù)和動態(tài)約束82.3.4 mfc的宏觀框架體系82.4 mfc編程框架82.5 基于opengl+mfc的三維模擬的編程環(huán)境配置113 基于高度圖的地形生成153.1 由一幅高度圖生成地形的原理、關(guān)鍵算法154 系統(tǒng)的設(shè)計及實現(xiàn)174.1 系統(tǒng)的實現(xiàn)的原理、關(guān)鍵技術(shù)174.2 系統(tǒng)中高度圖的讀取、紋理映射184.3 系統(tǒng)的設(shè)計184.4 實驗結(jié)果(屏幕截圖)205 結(jié)論與展望235.1 結(jié)
6、論235.2 展望23致謝24參考文獻25摘要本文在吸取了計算機圖形學(xué)、現(xiàn)代數(shù)學(xué)、測繪學(xué)等眾多領(lǐng)域大量先進理論成果的基礎(chǔ)上,研究了地形建模的基本理論和方法基于高度圖的地形生成技術(shù).文章分析了基于高度圖的均勻網(wǎng)格地形渲染算法,給出了具體實現(xiàn)并提出了有效的改進方法。該算法頂點數(shù)組來提高對均勻網(wǎng)格的渲染效率;在多細(xì)節(jié)層次算法中增加了地形邊緣的細(xì)節(jié)層次,使地形輪廓更為清楚。指出圖形生成是虛擬現(xiàn)實的關(guān)鍵問題并綜述了圖形生成的技術(shù);隨后回顧了地形生成及實時顯示技術(shù)和方法。在此基礎(chǔ)上通過在位圖的灰度值與地形高程之間建立映射關(guān)系,快速生成了三維網(wǎng)格地形以生成具有高度真實感的三維地形。關(guān)鍵詞:三維地形;三維圖形
7、;地形建模;地形模型;灰度等級;三維地形模擬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é)的熱點,虛擬地形主要幾種方法分為高度圖,分形等。隨著計算機圖形學(xué)理論以及計算機軟、硬件的快速發(fā)展的發(fā)展,虛擬現(xiàn)實技術(shù)的發(fā)展的進步人們對自然環(huán)境虛擬技術(shù)水平越來越高。三維地形圖的設(shè)計與實現(xiàn)成為了一個重要的研
11、究方向,在虛擬現(xiàn)實生活中扮演著重要的角色。在構(gòu)建三維地形模型的基礎(chǔ)上,包括地形,河流,森林,建筑,乃至經(jīng)濟,科學(xué),文化,教育等方面。地形在計算機上模擬成為當(dāng)今世界最熱門的話題,由傳統(tǒng)的以平面地形圖為介質(zhì)表示二維現(xiàn)實地形到用計算機完成三維地形世界的真實再現(xiàn),以一種直接的、可視化的、易于理解的形式表示三維地表信息,是對客觀真實的立體地形認(rèn)識和表示的飛躍。根據(jù)模型的逼真度結(jié)合其他技術(shù)的應(yīng)用,以地形模型研究為基礎(chǔ),開展地形或大型工程、著名風(fēng)景名勝區(qū)的三維景觀實時顯示的研究,對于大型工程管理和仿真具有深遠(yuǎn)的學(xué)術(shù)意義,制作地形有好幾種方法來制作地形系統(tǒng)。每一種方法都有它的優(yōu)勢和弱勢,用高度圖來制作地形是相
12、當(dāng)簡單的,而且它可以生成一些最為真實的地形結(jié)構(gòu),如果在制作地形期間,哪個細(xì)節(jié)或有大的變動,使用高度圖來實現(xiàn)的都可以快速的完成修改。三維地形就存在我們生活范圍,比如說我們的經(jīng)常玩游戲。開發(fā)商為了更好的吸收玩家,開發(fā)商會不惜一切代價去開發(fā)虛擬地形,越來越細(xì)節(jié)化,游戲中的地形系統(tǒng)也隨著時間的推移變得越來越漂亮了。實現(xiàn)商家的經(jīng)濟利益最大化。三維地形圖最顯著特征就是臨場感,一個場景通過方向鍵結(jié)合其他按鍵來實現(xiàn)場景的左右旋轉(zhuǎn)、放大、縮小等。實現(xiàn)場景漫游,可以通過設(shè)置視點以及觀察方向來實現(xiàn)。讓地形場景更接近生活,真有種身臨其境的感覺。再說不久前狂熱3d電影阿凡達,在電影界引起熱潮,創(chuàng)造票房的奇跡,電影中有許
13、多地形都是虛擬的地形圖。還有小區(qū)景光等等??傊摂M地形不僅在旅游、游戲、電影這幾個方面體會它的價值。它已經(jīng)涉及到人們生活的方方面面,人們正在享受著它為我們帶來的樂趣,并利用這個機遇為社會創(chuàng)造價值。1.2 國內(nèi)外研究現(xiàn)狀國外對虛擬三維的實時繪制技術(shù)研究主要集中在實時的可見性提出技術(shù)、多分辨率細(xì)節(jié)層次lod簡化技術(shù)和基于圖像的繪制加速技術(shù)等。早在1976年,clark就提出應(yīng)用圖形學(xué)理論管理地理信息思想。近兒年來,關(guān)于模型三維地形的研究非?;馃幔霈F(xiàn)了各種算法和技術(shù),被模擬的對象也涉及到各個方面,比如光譜數(shù)據(jù)、地形數(shù)據(jù)以及自定義的幾何表面等。1996年。lindsstron等人提出了地形的連續(xù)lo
14、d繪制算法,該算法采用了規(guī)整網(wǎng)格四叉樹。大部被地形生成算法所引用。由于這個算法是至底向上的,所以出現(xiàn)大量無用的數(shù)據(jù)1。1997年rottge等人上面的算法進進的改進。采用自頂向下的四叉樹,控制相鄰細(xì)節(jié)層次不超過1來進行,算法實現(xiàn)了用geomirphing技術(shù)的來前者的不足2。2001年henrihaki提出了菱形地形的繪算法:clodp 這種算法基于幀相關(guān)的roam算法,采用一種擇的幾何學(xué)結(jié)構(gòu),三角形四叉樹,這種結(jié)構(gòu)優(yōu)于三角帶,操作的次數(shù)減少許多3。2004年f.losasso和h.hoppe提出了用嵌套的規(guī)則網(wǎng)格來繪制地形?;?xì)節(jié)層次的方法,這個算法基于規(guī)則網(wǎng)格和以三角塊為無素的四叉樹結(jié)構(gòu)。
15、但對硬件要求較高4.2006年malte clasen和hans提出了用球形來繪制地形。該算法基于gpu幾何繪制地形算法的一個擴展,地形的位標(biāo)的中點位于視點上,這樣使得同中心的環(huán)的細(xì)節(jié)是隨著半徑的大小漸增。這不同于其它的lod算法,這種算法在相鄰區(qū)域不同的lod之間不存在缺口問題,但是這種算法的計算量非常大6。2007zvikongen jinhd sana提出了四個直角三角形組成繪制,算法的公辯率也是四叉數(shù)據(jù)結(jié)構(gòu),但它每個塊都是由四個直角三角形組成,并且每個三角形的分辯率與它相鄰都是匹配的,算法均衡了cpu和gpu之間的計算量,并且減少了兩者之間的交互,把高程值直接當(dāng)紋理來進行傳輸6。國內(nèi)在
16、三維地形實時繪制技術(shù)的研究方面開展了一些工作,并取得了一定的研究成果。如浙江大學(xué)cad&cg國家重點實驗室開發(fā)的桌面虛擬地形環(huán)境實時漫游系統(tǒng)7;浙江大學(xué)開發(fā)的虛擬地形;國防科技大學(xué)計算機學(xué)院設(shè)計并實現(xiàn)的高性能分布仿真系統(tǒng);北京航空航天大學(xué)虛擬現(xiàn)實與可視化新技術(shù)研究室集成的分布式虛擬環(huán)境系統(tǒng)等。這些系統(tǒng)對虛擬環(huán)境中的一些核心技術(shù)如實時圖形生成技術(shù),模型的簡化技術(shù)等領(lǐng)域進行了研究。但是對一些相關(guān)的基礎(chǔ)性研究重視不夠。網(wǎng)絡(luò)三維地形中實體模型的創(chuàng)建和交互技術(shù)還有待進一步研究針對三維地形表面的特點,深刻剖析0pengl標(biāo)準(zhǔn),在增強地形繪制效果和提高地形繪制速度方面還有待進步深入研究地形模型的簡化
17、和多分辨率表示是三維地形模型能否實時繪制和進行動態(tài)交互的關(guān)鍵。它是在現(xiàn)有計算機硬件設(shè)備不能滿足實時繪制和動態(tài)交互處理要求的前提下,從軟件著手,根據(jù)人眼觀察景物的特點和某個設(shè)定的精度要求,對不同地形區(qū)域采用不同的網(wǎng)格分辨率進行繪制,精到每個點;微機上對大規(guī)模地形實時繪制8從90年代開始,眾多學(xué)者從不同的角度出發(fā),針對地形的特點,對地形模型的簡化和多分辨率表示技術(shù)進行了初步地研究9,提出了一些數(shù)據(jù)模型和算法關(guān)于這方面的研究還處在一個發(fā)展深入的階段,針對多分辨率表示技術(shù)的要求,適合當(dāng)前微機硬件環(huán)境的新模型和算法需要被提出和研究當(dāng)前,真實感圖形實時繪制是計算機科學(xué)的研究熱點1.2 本文研究的內(nèi)容(1)
18、本文綜述各種三維地形生成技術(shù)的原理和實現(xiàn),分析各種三維地形生成算法,著重對基于高度圖的地形生成技術(shù)進行深入分析,討論了基于高度圖的地形高程生成。(2)基于高度圖的地表特征的生成,深入分析基于高度圖的地形生成。將三維地形逼真地繪制出來但是這是一項較為復(fù)雜的系統(tǒng)工程,需要借助于許多地形生成技術(shù)來實現(xiàn)簡單的基于高度圖的三維地形生成系統(tǒng)。(3)基于格網(wǎng)高程映射,對高度圖進行渲染生成地形圖2 基于openglmfc的建模基礎(chǔ)2.1 opengl概述opengl是個定義了一個跨編程語言、跨平臺的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。opengl是個專業(yè)的圖形程序接口,是一個功能強大,調(diào)用方便的底層
19、圖形庫。1992年7月,sgi公司發(fā)布了opengl的1.0版本,隨后又與微軟公司共同開發(fā)了windows nt版本的opengl,從而使一些原來必須在高檔圖形工作站上運行的大型3d圖形處理軟件也可以在微機上運用。1995年opengl的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。包括提高頂點位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識的傳輸速度,引入了新的紋理特性等等。1997年,windows 95下3d游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個功能強大、兼容性好的3d圖形接口,而當(dāng)時微軟公司自己的3d圖形接口directx 3.0功能卻是很糟糕。因而以制作雷神
20、之錘等經(jīng)典3d射擊游戲而著名的id公司同其它一些游戲開發(fā)公司一同強烈要求微軟在windows 95中加入對opengl的支持。微軟公司最終在windows 95的osr2版和后來的windows 版本中加入了對opengl的支持。這樣,不但許多支持opengl的電腦3d游戲得到廣泛應(yīng)用,而且許多在3d圖形設(shè)計軟件也可以運用支持opengl標(biāo)準(zhǔn)的3d加速卡,大大提高其3d圖形的處理速度。2003年的7月28日,sgi和arb公布了opengl 1.5。opengl 1.5中包括opengl arb的正式擴展規(guī)格繪制語言“opengl shading language”。opengl 1.5的新功
21、包括:頂點buffer object、shadow功能、隱蔽查詢、非乘方紋理等。2004年8月,opengl2.0版本發(fā)布o(jì)pengl 2.0標(biāo)準(zhǔn)的主要制訂者并非原來的sgi,而是逐漸在arb中占據(jù)主動地位的3dlabs。opengl2.0支持opengl shading language、新的shader擴展特性以及其他多項增強特性。2008年8月初khronos工作組在siggraph 2008大會上宣布了opengl 3.0圖形接口規(guī)范,glsl1.30 shader語言和其他新增功能將再次未來開放3d接口發(fā)展指明方向。opengl 3.0 api開發(fā)代號為longs peak,和以往一
22、樣,opengl 3.0仍然作為一個開放性和跨平臺的3d圖形接口標(biāo)準(zhǔn),在shader語言盛行的今天,ogl3.0增加了新版本的shader語言:glsl 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。同時,ogl3.0還引入了一些新的功能,例如頂點矩陣對象,全幀緩存對象功能,32bit浮點紋理和渲染緩存,基于阻塞隊列的條件渲染,緊湊行半浮點頂點和像素數(shù)據(jù),四個新壓縮機制等等。2009年3月又公布了升級版新規(guī)范opengl 3.1,也是這套跨平臺免費api有史以來的第九次更新。opengl 3.1將此前引入的opengl著色語言“glsl”從1.30版升級到了1.40版,通過改進程序增強了對最
23、新可編程圖形硬件的訪問,還有更高效的頂點處理、擴展的紋理功能、更彈性的緩沖管理等等。寬泛地講,opengl 3.1在3.0版的基礎(chǔ)上對整個api模型體系進行了簡化,可大幅提高軟件開發(fā)效率。2009年8月khronos小組發(fā)布了opengl 3.2,這是一年以來opengl進行的第三次重要升級。該版本仍然延續(xù)了opengl發(fā)展的方向讓圖形程序開發(fā)者能在多種操作系統(tǒng)和平臺下更好的利用新的gpu功能。opengl3.2版本提升了性能表現(xiàn)、改進了視覺質(zhì)量、提高了幾何圖形處理速度,而且使direct3d程序更容易移植為opengl。除opengl之外,khronos還將其開發(fā)的其它標(biāo)準(zhǔn)進行了協(xié)調(diào)改進,以
24、求可以在更廣泛的領(lǐng)域提供強大的圖形功能和計算生態(tài)系統(tǒng),這些標(biāo)準(zhǔn)包括用于并行計算的opencl、用于移動3d圖形開發(fā)的opengl es和用于網(wǎng)絡(luò)3d開發(fā)的webgl。khronos旗下的opengl arb(architecture review board)工作組推出了glsl 1.5openglshading language(opengl著色語言)的升級版,以及在opengl3.2框架下推出了兩個新功能,可以讓開發(fā)者在開發(fā)新程序時能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會提供與舊版opengl之間的兼容性。2.2 opengl渲染管道絕大多數(shù)opengl的實現(xiàn)都有
25、一個的相類似的操作順序,一系列處理階段稱為opengl渲染管道。如圖1 顯示了opengl處理數(shù)據(jù)的過程。幾何數(shù)據(jù)(頂點、線、多邊形)跟隨著這些路徑通過這些代表求值程序和每一個頂點操作的盒子,而像素數(shù)據(jù)(像素、圖像、位圖)的部分加工處理過程有些不同。在將最后的像素數(shù)據(jù)寫到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過最后相同的步驟(光柵化和片段操作)。圖1 opengl渲染管道下面我們更為詳細(xì)的介紹opengl渲染管線的一些關(guān)鍵階段。2.2.1 顯示列表 任何數(shù)據(jù),不管它所描述的是幾何圖形還是像素,都可以保存在顯示列表(display list)中,供當(dāng)前或以后使用。當(dāng)然,我們也可以不把數(shù)據(jù)保存在顯示列表中
26、,而是立即對數(shù)據(jù)進行處理,這種模式也稱為立即模式(immediate mode)。當(dāng)一個顯示列表被執(zhí)行時,被保存的數(shù)據(jù)就從顯示列表中取出,就像在立即模式下直接由應(yīng)用程序所發(fā)送的那樣。2.2.2 求值器 所有的幾何圖元最終都要通過頂點來描述。參數(shù)化曲線和表面最初可能是通過控制點以及成為基函數(shù)(basic function)的多項式函數(shù)進行描述的。求職器提供了一種方法。根據(jù)控制點計算表示表面的頂點。這種方法是一種多項式映射,它可以根據(jù)控制點產(chǎn)生表面法線、紋理坐標(biāo)、顏色以及空間坐標(biāo)。2.2.3 基于頂點的操作 對于頂點數(shù)據(jù),接下來的一個步驟就是"基于頂點的操作",就是把頂點變換為
27、圖元。有些類型的頂點數(shù)據(jù)(例如空間坐標(biāo))是通過一個4*4的浮點矩陣進行變換的??臻g坐標(biāo)從3d世界的一個位置投影到屏幕上的一個位置。如果啟用了高級特性,這個階段將更為忙碌。如果使用了紋理,這個階段還將生成并變換紋理坐標(biāo)。如果啟用了光照,就需要綜合變換后的頂點,表面法線,光源位置,材料屬性以及其他光照信息進行光照計算,產(chǎn)生最終的顏色值。2.2.4 圖元裝配 圖元裝配的一個主要內(nèi)容就是剪裁,它的任務(wù)是消除位于半空間(half-space)之外的那部分幾何圖元,而這個半空間是由一個平面所定義的。點剪裁就是簡單地接受或拒絕頂點,直線或多邊形剪裁則可能需要添加額外的頂點,具體取決于直線或多邊形是如何進行剪
28、裁的。在有些情況下,接下來需要執(zhí)行一個稱為透視除法(perspective division)的步驟。它使遠(yuǎn)處的物體看起來比近處的物體更小一些。接下來所進行的是視口(viewport)和深度(z坐標(biāo))操作。如果啟用了剔除功能(culling)并且該圖元是個多邊形,那么它就有可能被剔除測試所拒絕。取決于多邊形模式,多邊形可能被畫成點的形式或者直線的形式。這個階段所產(chǎn)生的結(jié)果就是完整的幾何圖元,也就是根據(jù)相關(guān)的顏色,深度(有時還有紋理坐標(biāo)值以及和光棚化處理有關(guān)的一些指導(dǎo)信息)進行了變換和剪裁的頂點。2.2.5 像素操作 在opengl的渲染管線中,和單路徑的幾何數(shù)據(jù)相比,像素數(shù)據(jù)所經(jīng)歷的流程有所不
29、同。首先,來自系統(tǒng)內(nèi)存的一個數(shù)組中的像素進行解包,從某種格式(像素的原始格式可能有多種)解包為適當(dāng)數(shù)量的數(shù)據(jù)成分。接著,這些數(shù)據(jù)被縮放、偏移,并根據(jù)一副像素圖進行處理。處理結(jié)果先進行截取,然后或者寫入到紋理內(nèi)存,或者發(fā)送到光棚化階段。如果像素數(shù)據(jù)時從幀緩沖區(qū)讀取的,就對他們執(zhí)行像素轉(zhuǎn)換操作(縮放、偏移、映射和截取)。然后,這些結(jié)果被包裝為一種適當(dāng)?shù)母袷?,并返回到系統(tǒng)內(nèi)存的一個數(shù)組中。opengl有一種特殊的像素復(fù)制操作,可以把數(shù)據(jù)從幀緩沖區(qū)復(fù)制到幀緩沖區(qū)的其他位置或紋理內(nèi)存中。這樣,在數(shù)據(jù)寫入到紋理內(nèi)存或者寫回到幀緩沖區(qū)之前,只需要進行一道像素轉(zhuǎn)換就可以了。2.2.6 紋理裝配 opengl應(yīng)
30、用程序可以在幾何物體上應(yīng)用紋理圖像,使它們看上去更為逼真。如果需要使用多幅紋理圖像,把它們放在紋理對象中是一種明智的做法。這樣,就可以很方便地在他們之間進行切換。有些opengl實現(xiàn)擁有一些特殊的資源,可以加速紋理的處理。這種資源可能是專用的,高性能的紋理內(nèi)存。如果確實擁有這種內(nèi)存,紋理對象可能會優(yōu)先進行處理,以控制這種有限和寶貴的資源的使用。2.2.7 光棚化 光棚化就是把幾何數(shù)據(jù)和像素數(shù)據(jù)轉(zhuǎn)換為片斷(fragment)的過程。每個片斷方塊對應(yīng)用于幀緩沖區(qū)中的一個像素。把頂點連接起來形成直線或者計算填充多邊形的內(nèi)部像素時,需要考慮直線和多邊形的點畫模式,直線的寬度,點的大小,著色模型以及用于
31、支持抗鋸齒處理的覆蓋計算。每個片斷方塊都將具有各自的顏色和深度值。2.2.8 片斷操作 在數(shù)據(jù)實際存儲到幀緩沖區(qū)之前, 將要執(zhí)行一系列的操作。這些操作可能會修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。第一個可能遇到的操作是紋理化。在紋理內(nèi)存中為每個片斷生成一個紋理單元(texel,也就是紋理元素),并應(yīng)用到這個片斷上。接著可能進行的是霧計算,然后是剪裁測試,alpha測試,模板測試和深度緩沖區(qū)測試(深度緩沖區(qū)用于消除被隱藏的表面)。如果一個片斷無法通過一個啟用的測試,它的連續(xù)處理過程可能會被中斷。隨后,將要執(zhí)行的可能是混合,抖動,邏輯操作以及根據(jù)一個位掩碼的屏蔽操作。最后,經(jīng)過完整處
32、理的片斷就被繪制到適當(dāng)?shù)木彌_區(qū),最終成為一個像素并到達它的最終歸宿。2.3 mfc概述mfc,微軟基礎(chǔ)類(microsoft foundation classes), 用于在c+環(huán)境下編寫應(yīng)用程序的一個框架和引擎。該類庫提供一組通用的可重用的類庫供開發(fā)人員使用。大部分類均從cobject 直接或間接派生,只有少部分類例外。mfc類庫作為c+與windows的接口,建立在win32應(yīng)用程序編程接口api之上,封裝了大多數(shù)的api函數(shù),主要是api中與程序結(jié)構(gòu)相關(guān)的部分和最常用的部分。mfc還封裝了重要的windows擴展,如com,activex,odbc和internet apis,為這些難以
33、編程實現(xiàn)的功能提供了簡便方法。mfc中的各種類結(jié)合起來構(gòu)成了一個應(yīng)用程序框架,讓程序員在此基礎(chǔ)上來建立windows下的應(yīng)用程序。mfc框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓。visual c+提供了相應(yīng)的工具來完成這個工作:appwizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于直觀地設(shè)計用戶界面;classwizard用來協(xié)助添加代碼到框架文件;最后進行編譯,則通過類庫實現(xiàn)了應(yīng)用程序特定的邏輯。在mfc編程中,入口函數(shù)winmain()被封裝在mfc的應(yīng)用程序框架內(nèi),已經(jīng)不用也不可
34、以再定義為另一個winmain()函數(shù)。mfc編程最好的辦法是使用mfc的應(yīng)用程序向?qū)Чぞ遖ppwizard。appwizard為程序員提供了一種快捷方便的工具來定制基于mfc的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來實現(xiàn)所需功能。mfc是一個編程框架,mfc中的各種類結(jié)合起來構(gòu)成了一個應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立windows下的應(yīng)用程序,這是一種相對sdk來說更為簡單的方法。因為總體上,mfc框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓。microsoft visual
35、 c+提供了相應(yīng)的工具來完成這個工作:appwizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計用戶接口;classwizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實現(xiàn)了應(yīng)用程序特定的邏輯。2.3.1 封裝 構(gòu)成mfc框架的是mfc類庫。mfc類庫是c+類庫。這些類或者封裝了win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了ole特性,或者封裝了odbc和dao數(shù)據(jù)訪問的功能,等等,分述如下。(1)對win32應(yīng)用程序編程接口的封裝用一個c+ object來包裝一個windows object。例如:class cwnd是一個c+ w
36、indow object,它把windows window(hwnd)和windows window有關(guān)的api函數(shù)封裝在c+ window object的成員函數(shù)內(nèi),后者的成員變量m_hwnd就是前者的窗口句柄。(2)對應(yīng)用程序概念的封裝使用sdk編寫windows應(yīng)用程序時,總要定義窗口過程,登記windows class,創(chuàng)建窗口,等等。mfc把許多類似的處理封裝起來,替程序員完成這些工作。另外,mfc提出了以文檔-視圖為中心的編程模式,mfc類庫封裝了對它的支持。文檔是用戶操作的數(shù)據(jù)對象,視圖是數(shù)據(jù)操作的窗口,用戶通過它處理、查看數(shù)據(jù)。(3)對com/ole特性的封裝ole建立在com
37、模型之上,由于支持ole的應(yīng)用程序必須實現(xiàn)一系列的接口(interface),因而相當(dāng)繁瑣。mfc的ole類封裝了ole api大量的復(fù)雜工作,這些類提供了實現(xiàn)ole的更高級接口。(4)對odbc功能的封裝以少量的能提供與odbc之間更高級接口的c+類,封裝了odbc api的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫編程模式。2.3.2 繼承 首先,mfc抽象出眾多類的共同特性,設(shè)計出一些基類作為實現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是cobject和ccmdtarget。cobject是mfc的根類,絕大多數(shù)mfc類是其派生的,包括ccmdtarget。cobject 實現(xiàn)了一些重要的特性,包括動
38、態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從cobject派生的類都將具備或者可以具備cobject所擁有的特性。ccmdtarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。mfc中,任何可以處理消息的類都從ccmdtarget派生。針對每種不同的對象,mfc都設(shè)計了一組類對這些對象進行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是cwnd,派生了cview類;應(yīng)用程序?qū)ο螅愂莄winthread;文檔對象,基類是cdocument,等等。程序員將結(jié)合自己的實際,從適當(dāng)?shù)膍fc類中派生出自己的類,實現(xiàn)特定的功能,達到自
39、己的編程目的。2.3.3 虛擬函數(shù)和動態(tài)約束 mfc以“c+”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,cwnd封裝 windows窗口對象時,每一條windows消息對應(yīng)一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計成虛擬函數(shù),由于數(shù)量太多,實現(xiàn)起來不現(xiàn)實。于是,mfc建立了消息映射機制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。這樣,通過虛擬函數(shù)和消息映射,mfc類提供了豐富的編程接口。程序員繼承基類的同時,把自己實現(xiàn)的虛擬函數(shù)和消
40、息處理函數(shù)嵌入mfc的編程框架。mfc編程框架將在適當(dāng)?shù)臅r候、適當(dāng)?shù)牡胤絹碚{(diào)用程序的代碼。本書將充分的展示mfc調(diào)用虛擬函數(shù)和消息處理函數(shù)的內(nèi)幕,讓讀者對mfc的編程接口有清晰的理解。2.3.4 mfc的宏觀框架體系 如前所述,mfc實現(xiàn)了對應(yīng)用程序概念的封裝,把類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用等封裝起來。這樣封裝的結(jié)果對程序員來說,是一套開發(fā)模板(或者說模式)。針對不同的應(yīng)用和目的,程序員采用不同的模板。例如,sdi應(yīng)用程序的模板,mdi應(yīng)用程序的模板,規(guī)則dll應(yīng)用程序的模板,擴展dll應(yīng)用程序的模板,ole/activex應(yīng)用程序的模板,等等。這些模板都采用了以文檔-視為中心的
41、思想,每一個模板都包含一組特定的類。典型的mdi應(yīng)用程序的構(gòu)成將在下一節(jié)具體討論。為了支持對應(yīng)用程序概念的封裝,mfc內(nèi)部必須作大量的工作。例如,為了實現(xiàn)消息映射機制,mfc編程框架必須要保證首先得到消息,然后按既定的方法進行處理。又如,為了實現(xiàn)對dll編程的支持和多線程編程的支持,mfc內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內(nèi)部處理對程序員來說是透明的,但是,懂得和理解mfc內(nèi)部機制有助于寫出功能靈活而強大的程序??傊?,mfc封裝了win32 api,ole api,odbc api等底層函數(shù)的功能,并提供更高一層的接口,簡化了windows編程。同
42、時,mfc支持對底層api的直接調(diào)用。mfc提供了一個windows應(yīng)用程序開發(fā)模式,對程序的控制主要是由mfc框架完成的,而且mfc也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等。框架或者由其本身處理事件,不依賴程序員的代碼;或者調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。mfc是c+類庫,程序員就是通過使用、繼承和擴展適當(dāng)?shù)念悂韺崿F(xiàn)特定的目的。例如,繼承時,應(yīng)用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實現(xiàn)這種功能的基礎(chǔ)是c+對繼承的支持,對虛擬函數(shù)的支持,以及mfc實現(xiàn)的消息映射機制。2.4 mfc編程框架用appwizard產(chǎn)生一個mdi工程t(無ole等
43、支持),appwizard創(chuàng)建了一系列文件,構(gòu)成了一個應(yīng)用程序框架。這些文件分四類:頭文件(.h),實現(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類對應(yīng)地派生出ctapp、ctdoc、ctview、cmainframe、cchildframe五個類,這五個類的實例分別是應(yīng)用程序?qū)ο?、文檔對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。
44、對這些類或者對象解釋如下。 (1)應(yīng)用程序 應(yīng)用程序類派生于cwinapp。基于框架的應(yīng)用程序必須有且只有一個應(yīng)用程序?qū)ο?,它?fù)責(zé)應(yīng)用程序的初始化、運行和結(jié)束。 (2)邊框窗口 如果是sdi應(yīng)用程序,從cframewnd類派生邊框窗口類,邊框窗口的客戶子窗口(mdiclient)直接包含視窗口;如果是mdi應(yīng)用程序,從cmdiframewnd類派生邊框窗口類,邊框窗口的客戶子窗口(mdiclient)直接包含文檔邊框窗口。 如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加ctoolbar和cstatusbar類型的成員變量,以及在一個oncreate消息處理函數(shù)中初始化這兩個控制窗口。 邊
45、框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(shift+f1模式)和打印預(yù)覽)。 (3)文檔邊框窗口 文檔邊框窗口類從cmdichildwnd類派生,mdi應(yīng)用程序使用文檔邊框窗口來包含視窗口。 (4)文檔 文檔類從cdocument類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實現(xiàn)的。視窗口通過文檔對象來訪問和更新數(shù)據(jù)。 (5)視 視類從cview或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對文檔的操作。 (6)文檔模板 (a)文檔模板類一般不需要派生。mdi應(yīng)用程序使用多
46、文檔模板類cmultidoctemplate;sdi應(yīng)用程序使用單文檔模板類csingledoctemplate。 應(yīng)用程序通過文檔模板類對象來管理上述對象(應(yīng)用程序?qū)ο?、文檔對象、主邊框窗口對象、文檔邊框窗口對象、視對象)的創(chuàng)建。 (b)構(gòu)成應(yīng)用程序的對象之間的關(guān)系圖3 應(yīng)用程序的對象之間的關(guān)系 用圖的形式可直觀地表示所涉及的mfc類的繼承或者派生關(guān)系,如圖3所示意。 圖所示的類都是從cobject類派生出來的;所有處理消息的類都是從ccmdtarget類派生的。如果是多文檔應(yīng)用程序,文檔模板使用cmultidoctemplae,主框架窗口從cmdifarmewnd派生,它包含工具條、狀態(tài)欄
47、和文檔框架窗口。文檔框架窗口從cmdichildwnd派生,文檔框架窗口包含視,視從cview或其派生類派生。(c) 構(gòu)成應(yīng)用程序的文件通過上述分析,可知appwizard產(chǎn)生的mdi框架程序的內(nèi)容,所定義和實現(xiàn)的類。下面,從文件的角度來考察appwizard生成了哪些源碼文件,這些文件的作用是什么。表1列出了appwizard所生成的頭文件,表2列出了了appwizard所生成的實現(xiàn)文件及其對頭文件的包含關(guān)系。 表1 appwizard所生成的頭文件表2 appwizard所生成的實現(xiàn)文件 從表2中的包含關(guān)系一欄可以看出: ctapp 的實現(xiàn)用到所有的用戶定義對象,包含了他們的定義;cvie
48、w 的實現(xiàn)用到ctdoc;其他對象的實現(xiàn)只涉及自己的定義; 當(dāng)然,如果增加其他操作,引用其他對象,則要包含相應(yīng)的類的定義文件。2.5 基于opengl+mfc的三維模擬的編程環(huán)境配置下面介紹在vc 環(huán)境中建立基于 opengl 標(biāo)準(zhǔn)的應(yīng)用程序框架的具體方法與步驟(1) 創(chuàng)建mfc項目文件:選擇file/new 菜單選項,建立一個名為 mytest 的單文檔 (sdi) 應(yīng)用程序 (2) 配置opengl編程環(huán)境:即添加opengl圖形開發(fā)接口庫文件。選擇project/setting 菜單選項,在 link 欄的 lib 輸入域中添加 openg132.lib 、 glu32.lib ,若需使
49、用 opengl 的輔助庫函數(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è)置 /*定 義 像 素 存 儲 格 式 */ bool cmyterrain1view:setuppixelformat()pixelformatdescriptor pfd = sizeof(pixelformatdescriptor), / pfd結(jié)構(gòu)的大小 1, / 版本號 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, / 沒有非透明度緩存 0, / 忽略移位位 0, / 無累加緩存 0, 0, 0, 0, / 忽略累加位 32, / 32 位深度緩存 0, / 無模板緩存 0, / 無輔助緩存 pfd_main_plane, / 主層 0, / 保留 0, 0, 0 / 忽略層,可見性和損毀掩模 ; 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 類添加一個公有的成員變量,類型為 cclientdc ,命名為* m_pdc。 (6) 為cmytestview 類添加 wm_destroy 函數(shù),并修改代碼如下:注意,新添加的代碼一定要加在原來代碼之前,即 m_pdc 要先進行銷毀。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> 編譯、運行程序。(8)設(shè)置投影模式glviewport()用于設(shè)置視口,我們這里將其設(shè)置成與視區(qū)一樣大,這樣也能約束投影圖形的縱橫比例,使其不至于變形。glmaritxmode(gl_projection)選擇當(dāng)前要做變換的矩陣為投影矩陣,后面的gl_matrixmode(gl_modelview)則設(shè)置要做變換的矩陣為模視矩陣,因為我們后面將要用到的平移和旋轉(zhuǎn)變換都是針對模視矩陣的。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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度首付分期購房借款合同范本規(guī)定6篇
- 年度線性低密度聚乙烯產(chǎn)業(yè)分析報告
- 年度吸污車產(chǎn)業(yè)分析報告
- 2025年度樓房建筑工程合同糾紛解決協(xié)議4篇
- 二零二四年養(yǎng)老社區(qū)三方物業(yè)服務(wù)委托合同文本3篇
- 二零二五年度船舶租賃船運輸協(xié)議合同3篇
- 二零二五年酒店客房家具更新?lián)Q代合同3篇
- 2025年度智能交通信號系統(tǒng)安裝與維護承包協(xié)議合同范本3篇
- 二零二五版教育培訓(xùn)機構(gòu)合同標(biāo)的課程開發(fā)與教學(xué)質(zhì)量承諾3篇
- 2025年度生物質(zhì)能發(fā)電項目合作協(xié)議合同范本
- GB/T 33688-2017選煤磁選設(shè)備工藝效果評定方法
- GB/T 304.3-2002關(guān)節(jié)軸承配合
- 漆畫漆藝 第三章
- CB/T 615-1995船底吸入格柵
- 光伏逆變器一課件
- 貨物供應(yīng)、運輸、包裝說明方案
- (完整版)英語高頻詞匯800詞
- 《基礎(chǔ)馬來語》課程標(biāo)準(zhǔn)(高職)
- IEC61850研討交流之四-服務(wù)影射
- 《兒科學(xué)》新生兒窒息課件
- 材料力學(xué)壓桿穩(wěn)定
評論
0/150
提交評論