




已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
基于Visual Studio的模擬三維空間飛行游戲設(shè)計第1章 緒 論 1.1引言近幾年來,由于3D硬件繪圖技術(shù)的突破,使得實時描繪的畫面越來越精致,而且3D游戲性更多元化更逼近真實世界,因此在游戲產(chǎn)業(yè)中,3D游戲己經(jīng)逐漸取代ZD游戲而成為游戲市場的主流,即使是網(wǎng)絡(luò)游戲,也慢慢趨向3D化。在3D游戲制作方面,歐美和日本的一些廠商都擁有自己成熟的3D游戲引擎,他們所制作的游戲也有龐大且固定的玩家群,諸如虛幻系列、合金裝備2等,甚至被奉為經(jīng)典,市場潛力巨大。國內(nèi)3D游戲近年來也不乏精品,如長久以來倍受好評的軒轅劍,仙劍系列都開始向3D游戲過渡。 目前流行的3D游戲開發(fā)技術(shù)主要有Direct3D和OpenGL。在我所研究的項目中,采用Direct3D技術(shù)開發(fā)一個模擬三維空間的飛行游戲設(shè)計。本課題以Visual Studio 2003為開發(fā)平臺,利用用于三維景觀顯示的圖形相關(guān)函數(shù)庫創(chuàng)建3D對象,在景觀的三維顯示中,使用三維空間的本地坐標(biāo)系、世界坐標(biāo)系、投影坐標(biāo)系,空間的矢量、平面,3D變換所需的矢量和矩陣及幾何體表面紋理顯示設(shè)計做變換,對三維空間進行渲染。實現(xiàn)景觀的三維顯示,最終完成飛行游戲設(shè)計過程。在圖像方面需要解決的主要問題在于:三維空間的生成和渲染、光線的運用、3D模型和2D對象的調(diào)用和顯示等等。 本文主要介紹了用DirectX9.0進行計算機圖像設(shè)計的技術(shù),其中著重強調(diào)了在游戲方面的應(yīng)用。其中講述了Direot3D的基本原則和一些較高級的技術(shù)。從開發(fā)者的角度來說,DirectX是一組Windows平臺上的多媒體API。本文中主要論述的是其中的Direct3D,也就是用于3D圖像編程的部分。 本文主要有以下要點:首先第一部分介紹了3D編程中所需的一些數(shù)學(xué)知識,諸如三維空間中的矢量、平面,3D變換所需的矢量和矩陣運算知識等等;第二部分,講述了Direct3D與顯示硬件的關(guān)系,Direct3D所扮演的角色,設(shè)備的分類和運用及初始化,三維空間的本地坐標(biāo)系、世界坐標(biāo)系、投影坐標(biāo)系等概念。介紹了怎樣在Direct3D中顯示3D對象,3D技術(shù)的一些元素,諸如光,包括光源的種類和光與表面相交的情況等。包括凡何體表面紋理的顯示;作為最主要的第三部分,著重講述了Direct3D中各種技術(shù),主要是地形的渲染,包括實現(xiàn)景觀的三維顯示,飛行游戲的設(shè)計過程等。 1.2研究背景隨個人電腦以及Internet的普及,游戲業(yè)迎來了蓬勃發(fā)展的時代。數(shù)年之前在486機器上運行的DOS游戲已經(jīng)讓人玩的如癡如醉,興奮不已?,F(xiàn)在,由于CPU以及顯卡等設(shè)備的飛速發(fā)展,為人們開發(fā)更加炫目多彩的游戲提供了可能。一塊高性能的顯卡能在一秒鐘內(nèi)完成數(shù)千萬個多邊形的處理,高速CPU在顯卡的輔助下,所營造出的游戲環(huán)境幾乎可以亂真。 這幾年游戲產(chǎn)業(yè)的發(fā)展可以說是一波接著一波,呈現(xiàn)一片欣欣向榮,百家爭鳴的景象。游戲產(chǎn)業(yè)發(fā)展至今雖然只有30年左右的時間,卻己經(jīng)成為全球娛樂市場的主流,游戲軟件的銷售量更是與日俱增,甚至超過悠久歷史的電影與音樂產(chǎn)業(yè)。此外,三大游戲主機廠商一Sony的PlaystationZ、任天堂的GameCube以及微軟的XB0X之間競爭趨于白熱化,更使得整個游戲產(chǎn)業(yè)成為眾所矚目的焦點。在60年代,第一臺臺式計算機問世,當(dāng)時運行在Unix機器上的Core Wars,是最早的計算機游戲之一。在70年代的黃金歲月到來時,全世界的臺式計算機和小型計算機流行著文本游戲和粗糙的圖片游戲。在PC界,有史可考的最早一款PC游戲是斯考特亞當(dāng)斯1978年為TRS80開發(fā)的文字冒險游戲冒險島,正是這款不起眼的游戲開啟了今天近百億霉運的電腦游戲市場。80年代是電腦游戲升溫的年代。第一臺16位計算機問世,如IBM PC及兼容機、Mac、AtariST等等,這時候,游戲已經(jīng)變得很好看,甚至有了一些3D的游戲。但是,PC機仍然落后于游戲主機。在90年代初期,IBM PC及兼容機漸漸成為主流,伴隨著Windows3.0的發(fā)布,Apple Macintosh壽終正寢。用戶從此可以真正的在PC上進行游戲、編程、開發(fā)并連接其他東西。但是,PC在圖像和聲音上還依然落后。在1993年的后期,隨著Id Software發(fā)行了DOOM作為Wolfestein3D的換代產(chǎn)品,PC機開始成為家用微機市場玩游戲和編程的選擇。DOOM的成功表明了微機上是可以做任何事情的,而微軟敏銳的發(fā)現(xiàn)了這一點,并開始制定巨大的計劃涉足游戲,由此,DirectX1.0為游戲而生。進入21世紀(jì),使用大型3D引擎架構(gòu)的游戲逐漸成為市場的主流,并以絢麗的畫面和逼真的場景一次又一次的吸引著人們的目光。DirectX技術(shù)也成為當(dāng)今圖形處理及多媒體處理的主流技術(shù),目前版本已經(jīng)發(fā)展到了DirectX9.0c。 近幾年來,由于3D硬件繪圖技術(shù)的突破,使得實時描繪的畫面越來越精致,而且3D游戲性更多元化更逼近真實世界,因此在游戲產(chǎn)業(yè)中,3D游戲己經(jīng)逐漸取代ZD游戲而成為游戲市場的主流,即使是網(wǎng)絡(luò)游戲,也慢慢趨向3D化。雖然開發(fā)3D游戲過程中存在著諸如技術(shù)更新快、程序人員與美工的配合、各廠商所生產(chǎn)的3D硬件規(guī)格和特性不同、失敗率高等風(fēng)險,但不可否認,3D游戲己是大勢所趨。 3D游戲引擎的發(fā)展會日趨成熟,因此游戲開發(fā)的困難度也將隨著3D游戲引擎的成熟而逐日降低。由于這些3D游戲引擎的成熟發(fā)展,將使得游戲開發(fā)廠商可以將其開發(fā)的重心放在游戲內(nèi)容及游戲設(shè)計上,因此未來游戲廠商將可以擺脫復(fù)雜的3D繪圖技術(shù)的程序設(shè)計、溝通不易、跨平臺等等的困難,而更容易地設(shè)計出畫面華麗、內(nèi)容充實的游戲。 1.3國內(nèi)外研究現(xiàn)狀 隨著電腦繪圖技術(shù)的不斷演進,3D繪圖硬件效能的增強以及寬帶網(wǎng)絡(luò)的普及,3D技術(shù)的應(yīng)用也有了新的風(fēng)貌。目前3D技術(shù)的使用非常廣泛,它已經(jīng)成為各界研究、應(yīng)用的主題,3D應(yīng)用發(fā)展縱然也就成為了時勢所趨最熱門的研究話題,也是各行業(yè)努力的方向,它的發(fā)展主題跨及了制造設(shè)計、電子商務(wù)、動畫制作、多媒體教學(xué)、虛擬現(xiàn)實以及游戲行業(yè)等。 游戲產(chǎn)業(yè)有著豐厚的利潤的光輝的前景。就國內(nèi)的發(fā)展來看,最近這兩三年內(nèi)國內(nèi)的游戲公司如雨后春筍般的成立,所開發(fā)或代理的網(wǎng)絡(luò)游戲更是不勝枚舉。這幾年韓國的表現(xiàn)最為突出,特別是在網(wǎng)絡(luò)游戲的技術(shù)研發(fā)與游戲制作,其所發(fā)行的網(wǎng)絡(luò)游戲更成為全球游戲產(chǎn)業(yè)重要的指針之一。去年在美國洛杉磯所舉行的E3(ElectronicEntertainmentExposition)展中,已經(jīng)有幾家的韓國廠商擠入世界第一線游戲開發(fā)廠商之列。以全球游戲業(yè)界的發(fā)展來看美國一個市場研究就發(fā)表的報告顯示,到2002年底,全球電腦游戲產(chǎn)業(yè)已經(jīng)形成一個200億美元的巨大市場。日本是游戲產(chǎn)業(yè)最發(fā)達的地區(qū),在這兩個國家內(nèi),電子游戲已經(jīng)相繼超過以汽車制造為代表的傳統(tǒng)制造業(yè)而成為國民經(jīng)濟主導(dǎo)產(chǎn)業(yè)之一;而在美國,游戲業(yè)已經(jīng)超越擁有百年歷史的好萊塢電影業(yè)而成為整個電子娛樂產(chǎn)業(yè)的龍頭。游戲正成為與影視、音樂并駕齊驅(qū)的娛樂產(chǎn)業(yè)之一。而網(wǎng)絡(luò)游戲憑借著信息雙向交流、速度快、不受空間限制等互聯(lián)網(wǎng)優(yōu)勢,具有誘人的互動性、仿真性和競技性,已成為網(wǎng)絡(luò)業(yè)盈利優(yōu)厚的三大領(lǐng)域之一,游戲產(chǎn)業(yè)已被稱為“陽光產(chǎn)業(yè)”。 第2章 數(shù)學(xué)基礎(chǔ)2.1三維空間中的矢量幾何學(xué)中,用有向線段表示矢量。矢量并不需要放在特定的坐標(biāo)系中討論,矢量的兩個屬性是它的長度和他的頂點所指的方向。因此,可以用矢量來模擬既有大小又有方向的物理模型。例如,以后要實現(xiàn)的粒子系統(tǒng)。用矢量來模擬粒子的速度和加速度。在3D計算機圖形學(xué)中我們用矢量不僅僅模擬方向。例如我們常常想知道光線的照射方向,以及在3D世界中的攝像機。矢量為在三維空間中表示方向提供了方便。為我們提供了便利的描述3D空間方向的機制。 矢量與位置無關(guān)。有同樣長度和方向的兩個矢量是相等的,即是他們在不同的位置。在3D圖形程序中,雖然我們主要關(guān)心3D矢量,但有時也會用到2D和4D矢量。在D3DX庫中提供了D3DX VECTOR2和D3DX VECTOR4類來分別表現(xiàn)2D和4D矢量。不同維數(shù)的矢量有著和3D矢量一樣的性質(zhì),也就是他們描述大小和方向,僅僅是在不同的維數(shù)中。所有這些矢量的數(shù)學(xué)運算對于不同維數(shù)矢量都有效,只是有一個是除外,就是矢量積。這些運算我們可以通過論述3D矢量擴展到2D,4D甚至n維矢量。2.1.1矢量點乘 點乘是對兩相乘矢量的代數(shù)定義: u*v=ux vx +uy vy +uz vz =s (3.1)該算法似乎并沒有明顯的幾何意義,我們可以從下式找出其隱含意義: u*v=|u|v| (3.2)兩點乘的矢量夾角大小與其點乘結(jié)果有如下關(guān)系:乘積為0時,表示兩矢量垂直乘積大于0時,兩矢量糧食兩夾角小于90度乘積小于0時,兩矢量夾角大于90度2.1.2矢量差乘 矢量乘法的另一種模式是差乘。不同于點乘,所得結(jié)果是同時垂直于兩差乘矢量的得另一矢量:u*v=(uyvz - uz vy),(uz vx -uxvz),(ux vy -uy vx) (3.3)2.2矩陣基本變換一個mxn矩陣是擁有m行n列的數(shù)組。行數(shù)和列數(shù)決定了矩陣的維數(shù)。在Direct3D編程過程中,我們用4X4的矩陣來描述特定的變換,因為4x4的矩陣能夠提供變換所需的所有信息,這樣的大小能表現(xiàn)我們需要的所有變換。3x3的矩陣看似更加符合3D變換,然而很多變換都不能用3x3的矩陣來描述,例如平移、投影、反射等。增加為4x4的矩陣使我們能夠描述通過矢量與矩陣相乘所完成的矩陣變換。也正因為如此我們使用的是1X4的矢量,因為1x3的矢量是不能與4x4矩陣相乘的。主要的矩陣變換有平移,縮放和旋轉(zhuǎn)。下面的這幅圖是一個矩陣的例子,這個矩陣能使一個對象(由它的所有頂點)縮放到原來的三倍。 當(dāng)把一個相匹配的點或者一個向量的成員放置到一個1x4的行矩陣中,點和向量卻是3D的,所以就必須把3D點向量增大為4D的單行矩陣,這樣就符合向量與矩陣的乘法定義,而1x3的單行矩陣和4x4的矩陣相乘是不允許的。 那么,在使用第四個成員時(用w來表示),當(dāng)把一個點放置到一個1x4的行矩陣中時,設(shè)置w為1。允許對點進行適當(dāng)?shù)钠揭啤R驗橄蛄亢臀恢脽o關(guān),所以向量的平移沒有被定義,如果試圖這樣做會返回一個無意義的向量。為了防止對向量進行平移,當(dāng)把一個向量放置到一個1x4行矩陣中時,把w設(shè)置為0。例如:把點p=(p1,p2,p3)放置到一個單行矩陣中,就像這樣:p1,p2,p3,1,同樣把向量v=(v1,v2,v3)放置到一個單行矩陣中,就像這樣:v1,v2,v3,0設(shè)置w=1是為了讓點可以被恰當(dāng)移動,同樣我們設(shè)置w=0是為了防止向量被平移。當(dāng)檢查矩陣實際平移時這是一個非常清晰的模型。 矩陣是怎樣改變頂點的位置的呢?要改變一個頂點的x,y與z值,應(yīng)該把它們與某個矩陣相乘。 這其實是一種簡單的計算,只需要將x、y和z值分別與每列上的數(shù)相乘再相加,每列上得出的數(shù)都是新頂點的一個坐標(biāo)值。所以,只需操作矩陣就能完成這些類似旋轉(zhuǎn)、縮放或移動的變幻。幸運的是, DirectX給我們提供了一些函數(shù)能方便地生成一些通常的矩陣。那么,怎樣完成即縮放又旋轉(zhuǎn)(復(fù)合變換)的變幻呢?首先,我們需要兩個矩陣:一個用來旋轉(zhuǎn)的一個用來縮放的;然后,我們把兩個矩陣相乘,得出一個新的復(fù)合矩陣,即縮放又旋轉(zhuǎn)的矩陣;然后利用這個新的矩陣來變幻頂點。應(yīng)該注意的是,矩陣相乘并不是普通的乘法,而且,也不滿足交換率:矩陣AX矩陣B和矩陣BX矩陣A是不相等的。要把兩個矩陣相乘,需要把第一個矩陣的每一行和第二個矩陣的每一列都相乘。在上面的例子中,我們把第一個矩陣的第一行的每個元素與第二個矩陣的第一列的對應(yīng)元素相乘,然后把得出的四個結(jié)果相加,按此方法,我們得出了新矩陣的第一行的四個元素(Columnl-4),其它元素的計算方法依此類推。 第3章 DirectX 技術(shù)簡介3.1DirectX概述現(xiàn)在游戲的種類與數(shù)量幾乎是在呈爆炸式的增長,游戲的制作水平也在不斷的提高,其實就是DirectX造就了這一切。 DirectX(簡稱:DX)是一個用于多媒體應(yīng)用程序和硬件增強的編程環(huán)境,它是微軟開發(fā)的基于Windows平臺的一組多媒體應(yīng)用程式接口API(Application Programming Interface,應(yīng)用程序接口),該接口為設(shè)計高性能、實時的應(yīng)用程序提供了所需的資源,也是游戲制作者的API。在開發(fā)中,DirectX分為兩個部分,一個是運行庫,通過DirectX編譯出來的程序必須要有運行庫的支持,另外一個是開發(fā)庫,也就是游戲程序設(shè)計者們通常所說的SDK,這部分是在編譯DirectX程序是必需的,也就是說在程序編譯時我們既使用了DirectX的運行庫同時也使用了DirectX的開發(fā)庫。DirectX為程序員提供了一套完美的基于COM(Componet Object Model,組件對象模型)的游戲,從內(nèi)部原理探討,DirectX就是一系列的DLL(動態(tài)鏈接庫),通過這些DLL,開發(fā)者可以在無視于設(shè)備差異的情況下訪問底層的硬件,DirectX封裝了一些COM對象,這些COM對象為訪問系統(tǒng)硬件提供了一個主要的接口。使用DirectX的目的在于,可以使應(yīng)用程序(特別是游戲)在Microsoft Windows下的性能可以達到甚至超過在MS-DOS下的性能,并且為之提供一個強壯、標(biāo)準(zhǔn)化以及文檔化的編程環(huán)境。DirectX優(yōu)勢主要表現(xiàn)在兩個方面:1. 為軟件開發(fā)者提供硬件無關(guān)性 Microsoft 開發(fā)DirectX的初衷就是增強Windows系的游戲開發(fā)環(huán)境,在DirectX之前,多數(shù)的游戲開發(fā)都是基于MS-DOS的,那時游戲開發(fā)者不得不自己判別硬件的種類并逐一適應(yīng)。有了DirectX,游戲開發(fā)者就可以享受DirectX給他們帶來的設(shè)備無關(guān)性,而絲毫不受影響地直接訪問硬件。DirectX的首要目標(biāo)即是將MS-DOS下的許多特性移植到Windows平臺上來,在提高應(yīng)用程序的性能的同時,清楚個人呢電腦不斷更新的硬件給程序帶來的障礙。 另外,通過提供應(yīng)用程序和硬件之間一致的接口,DirectX讓基于Windows的應(yīng)用程序能對現(xiàn)有及未來的硬件系統(tǒng)進行高性能的、實時的訪問,發(fā)揮了硬件的最大潛能,也使應(yīng)用程序安裝和設(shè)置的復(fù)雜度大大降低。使用DirectX提供的編程接口,軟件開發(fā)人員能充分的利用硬件特性,卻不用操心硬件的具體實現(xiàn)?;?Windows的高性能游戲?qū)南铝屑夹g(shù)中獲利:(a) 專門為提高速度而設(shè)計的極速卡(b) 即插即用及其他Windows硬件和軟件(c) Windows內(nèi)建的通信支持(包括DirectPlay)2. 為硬件開發(fā)提供的規(guī)范 DirectX建議硬件設(shè)計遵循一定的規(guī)范,這個規(guī)范的制定基于高性能應(yīng)用程序的開發(fā)者和獨立硬件供應(yīng)商的反饋,因而,DirectX程序員參考的有關(guān)內(nèi)容甚至可能對現(xiàn)在尚未出現(xiàn)的加速硬件的特性進行描述,另一方面,軟件業(yè)可能僅僅關(guān)心在規(guī)范所限范圍之內(nèi)的硬件能力,而略過那些不被范圍所支持的特性。3.2 DirectX的基本結(jié)構(gòu)及組成3.2.1DirectX的基本結(jié)構(gòu)DirectX需要以設(shè)備無關(guān)的方法提供設(shè)備相關(guān)的性能,所以DirectX的結(jié)構(gòu)是由兩個驅(qū)動程序構(gòu)成的:硬件操作層(HAL)和硬件模擬曾(HEL),當(dāng)DirectX對象創(chuàng)建時,會同時建立一張“兼容表”,其中記錄了當(dāng)前用劍系統(tǒng)支持的功能,當(dāng)DirectX需要實現(xiàn)某個功能時就查詢該表,得到硬件對功能的支持信息,如果功能能夠得到硬件支持,則向HAL發(fā)出請求,以得到硬件的支持,否則就向HEL發(fā)出請求,以模擬方式實現(xiàn)該功能。圖3-1所示的是DirectX的基本結(jié)構(gòu)。圖3-1 DirectX的基本結(jié)構(gòu)3.2.2 DirectX的基本組成DirectX SDK是微軟所開發(fā)出的一套API函數(shù)庫,最初用于游戲的開發(fā),如今許多的多媒體軟件都是使用它所開發(fā)出來的。DirectX中包含了各種組件用來處理2D和3D圖像、聲音、網(wǎng)絡(luò)連接以及控制各類輸入裝置,是游戲開發(fā)中不可缺少的主角。它包含了編制計算機游戲和多媒體應(yīng)用程序最新技術(shù)和工具,為廣大程序員提供了一整套的應(yīng)用程序接口API,是程序員能夠設(shè)計高性能實時的應(yīng)用程序。圖3-2描述的是DirectX的基本組成:圖3-2 DirectX基本組成DirectX目前主要由表3-1所示的七個主要部分組成:表3-1 DirectX主要組件3.3 Direct3D 主要組件介紹3.3.1 DirectDraw組件 DirectDraw是DirectX SDK的主要組件之一,它允許直接對顯示內(nèi)存操作,支持硬件位塊傳輸、硬件覆蓋、表面翻轉(zhuǎn),并且保持同目前基于Windows的應(yīng)用程序和驅(qū)動程序兼容。DirectDraw是一種軟件接口,除了能直接對顯示設(shè)備存取外,還保持了與Windows圖形設(shè)備接口(Graphics Device Interface,GDI)的兼容性。 DirectDraw主要提供了完成以下任務(wù)的工具:管理多頁面、直接訪問視頻RAM、換頁(Page flipping)、后臺緩存(Back buffering)、管理調(diào)色板(Palette)、裁剪(Clipping)、視頻端口(Video port)。圖3-3顯示了DirectDraw,圖形設(shè)備接口(Graphics Device Interface,GDI),硬件操作層(Hardware Abatraction Layer,HAL),硬件抽象層(Hardware Emulation Layer,HEL)及硬件(Hardware)之間的關(guān)系。DirectDraw組件與GDI位于同一層次,都通過一個與設(shè)備相關(guān)的抽象層來直接處理硬件設(shè)備。與GDI不同的是,DirectDraw會盡可能的利用硬件加速特性。如果硬件不支持某種特性,DirectDraw會使用硬件抽象層(HEL)試圖將該特性進行軟件模擬。DirectDraw可以以設(shè)備環(huán)境(DC)的形式提供頁面存貯器,使得開發(fā)者可以使用GDI的函數(shù)操作頁面對象。圖3-3 DirectDraw與GDI、HAL、HEL、硬件的關(guān)系(1) 硬件操作層(Hardware Abatraction Layer,HAL) DirectDraw通過硬件操作層(HAL)提供設(shè)備索引。HAL是特殊設(shè)備接口,由硬件廠商提供,DirectDraw可以直接操作硬件,程序無須與HAL進行接觸。相反,通過HAL提供的基礎(chǔ)結(jié)構(gòu),DirectDraw使用相同的結(jié)構(gòu)讓應(yīng)用程序來顯示圖形。硬件制造商在Windows下實現(xiàn)的HAL包含16-bit及32-bit的代碼。在Windows NT下,HAL則是純32-bit的代碼。HAL可以是顯示卡驅(qū)動程序的一部分或單獨的動態(tài)銜接庫,以驅(qū)動程序的接口來通信,接口是由驅(qū)動程序設(shè)計者定義的。(2) 硬件抽象層(Hardware Emulation Layer,HEL) 當(dāng)通過硬件操作層(HAL)硬件無法支持某些特性,DirectDraw就試圖對其進行模擬,這功能時通過硬件抽象層來實現(xiàn)的。HEL提供的與HAL相同的功能。還有,在HAL,程序并不直接與HEL工作。在主要功能上其結(jié)果大體相同,而程序不必理會是由硬件提供的還是HEL模擬的。3.3.2 Direct3D 組件 Direct3D提供了在窗口操作系統(tǒng)上運行的3D互動游戲的可能,它提供了獨立于各種3D圖形加速硬件的一些獨立調(diào)用函數(shù)。用戶可以在兩種模式下使用Direct3D即立即模式(Immediate Mode)和保留模式(Retained Mode)。Direct3D立即模式適合于快速開發(fā),Direct3D保留模式為高級。實時的三維圖形提供了更高層次的支持和為層次結(jié)構(gòu)和動畫之類的圖形技術(shù)提供內(nèi)在支持。Direct3D保留模式建立在Direct3D立即模式之上。Direct3D為程序開發(fā)人員提供了許多高級功能,如:可切換的三度緩沖(使用z-buffer或w-buffer),平面和Gouraud陰影,多種光線和光線類型,豐富的素材和紋理支持功能,可靠的軟件仿真驅(qū)動程序,變換和裁剪,與硬件無關(guān)性,在Windows NT上的完全硬件加速(提供合適的設(shè)備驅(qū)動程序時),對專門的CPU指令集的內(nèi)嵌式支持,其中包括Intel的MMX和PentiumIII結(jié)構(gòu)以及AMD 3DNow的結(jié)構(gòu)。3.3.3 DirectSound組件 DirectSound提供了程序和音頻適配器的混音及播放功能之間的鏈接。還支持波形聲音的捕獲和播放。DirectSound為多媒體應(yīng)用程序提供低潛伏混合、硬件加速以及直接訪問聲音設(shè)備。在維護與現(xiàn)有設(shè)備驅(qū)動程序的兼容性時提供該功能。DirectSound設(shè)計目標(biāo)是提高聲音的輸出速度,實現(xiàn)多路聲音混合播放。3.3.4 DirectInput 組件 DirectInput為Windows環(huán)境的游戲和實時多媒體應(yīng)用程序處理輸入設(shè)備信息,尤其對游戲控制器和力反饋設(shè)備提供了完備的支持。DirectInput和其他DirectX組成部分一樣,是通過硬件抽象層和硬件仿真層來實現(xiàn),但是一般來說,所有的游戲控制器都有合適的驅(qū)動程序來支持,所以一般來說使用硬件仿真層的內(nèi)容并不多,大多數(shù)的控制器是通過DirectX調(diào)用驅(qū)動程序來完成。DirectInput可識別三種基本設(shè)備類型:1. 鍵盤,標(biāo)準(zhǔn)系統(tǒng)鍵盤。2. 鼠標(biāo),這一類中包括素有類似于鼠標(biāo)的設(shè)備,如觸摸板、跟蹤球以及相應(yīng)的按 鍵。3. 游戲桿,相對于其他類型的控制器和力反饋設(shè)備而言,這是易于產(chǎn)生誤解的名 稱,其范圍從簡單的游戲桿直至虛擬現(xiàn)實的復(fù)雜設(shè)備。3.3.5 DirectPlay 組件DirectPlay是為了滿足現(xiàn)在流行的網(wǎng)絡(luò)游戲而開發(fā)的API,它是一個用于連接傳輸協(xié)議和網(wǎng)絡(luò)設(shè)備之間的接口程序。DirectPlay支持多通信協(xié)議,可以運行在采用TCP/IP或者是IPX協(xié)議的網(wǎng)絡(luò)上,甚至也可以使用Modem進行連接,而且DirectPlay還為將來的協(xié)議預(yù)備了很好的擴展空間。DirectPlay提供了高級的傳輸服務(wù)(例如,有保證或無保證的傳遞,慢速鏈接上的通訊扼殺,以及放棄連接檢測等),也提供了會話層服務(wù)(包括玩家名稱表管理和點對點主機轉(zhuǎn)移)。圖3-4顯示了DirectPlay體系結(jié)構(gòu),以及它如何提供與通訊服務(wù)提供層序無關(guān)的獨立性。圖3-4 DirectPlay體系結(jié)構(gòu)3.4 Direct3D基礎(chǔ)3.4.1 Direct3D設(shè)備Direct3D是讓我們能夠用3D硬件加速完成渲染3D世界的底層顯示API。扮演了聯(lián)系應(yīng)用程序和顯示設(shè)備的調(diào)度者的角色。Direct3D設(shè)備是Direct3D渲染的組成部分。它用來封裝(encapsulate)和存儲(store)渲染狀態(tài)它們之間的關(guān)系如下圖所示:圖4-1 Direct3D設(shè)備關(guān)系圖 當(dāng)前Direct3D支持兩種主要類型的Direct3D設(shè)備:一種是硬件抽象層(HAL)設(shè)備,應(yīng)用程序不能直接訪問3-D加速卡。他們要調(diào)用Direct3D的函數(shù)和方法。Direct3D通過HAL來訪問硬件。如果程序運行的計算機支持HAL,那么使用HAL設(shè)備就能獲得最好的性能。HAL設(shè)備具有硬件光柵化加速,并可用軟硬件頂點處理進行著色操作;另一種是參考設(shè)備(REF)??梢哉J為這些設(shè)備是兩個單獨的驅(qū)動程序。軟件和參考設(shè)備由軟件驅(qū)動程序表示,而HAL設(shè)備由硬件驅(qū)動程序表示。 HAL是一個設(shè)備相關(guān)的接口,由設(shè)備制造商提供,Direct3D使用HAL與顯示硬件協(xié)同工作。應(yīng)用程序從不直接與HAL打交道。相反,通過隊L提供的基礎(chǔ),Direct3D提供了一組統(tǒng)一的接口和方法,應(yīng)用程序用這些接口和方法繪制/顯示圖形。 或許你想用Direct3D提供的功能進行編程但在你的設(shè)備卻無法實現(xiàn),為此,Direct3D提供了用軟件模擬整個Direct3D API的REF設(shè)備,這使你能夠在設(shè)備不支持的情況下使用Direct3D特征編寫和測試代碼。3.5初始化Direct3D3.5.1獲取Direct3D9接口利用Direct3D函數(shù)可以方便地獲取IDirect3D9接口指針: IDirect3D9*_ d3d9; _d3d9=Direct3DCreate9(D3D_ SDK VERSION); IDirect3D9對象主要用于兩個方面:枚舉設(shè)備特征和創(chuàng)建IDirect3DDevice9對象。設(shè)備特征主要有:設(shè)備能力、顯示模式、格式和關(guān)于每個系統(tǒng)中其他可用設(shè)備的信息。3.5.2檢測硬件頂點處理 創(chuàng)建IDirect3DDevice9對象后,我們必須指定頂點處理類型以便使用。如果允許的話我們應(yīng)該使用硬件頂點處理,但由于并不是所有設(shè)備都支持硬件頂點處理,所以首先要檢測設(shè)備是否支持: RESULT IDirect3D9:GetDeviceCaps( UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps ); /檢查此適配器上的設(shè)備對希望使用的功能的支持度 m_pd3dDevice-GetDeviceCaps(8rm_d3dCaps):然后檢測設(shè)備能力。3.5.3實例化D3DPRESENT_ PARAMETERS結(jié)構(gòu)成員變量D3DPRESENT_ PARAMETERS 結(jié)構(gòu)用于指定我們將要創(chuàng)建的IDirect3DDevice9對象的一些屬性。3.5.4創(chuàng)建IDirect3DDevice9接口 使用設(shè)備接口,主要是用來操作一個Direct3Ddevice對象的渲染狀態(tài)、燈光狀態(tài)以及執(zhí)行渲染操作。盡管設(shè)備支持三個設(shè)備接口(IDirect3DDevice,IDirect3DDevice2,和IDirect3DDevice3),但是程序中并不需要使用多個設(shè)備接口。使用那種接口,要有所使用的渲染方法來決定,即DrawPrimitive方法或執(zhí)行緩沖方法。最新的兩個設(shè)備接口是IDirect3DDevice3和IDirect3DDevice2,它們都支持DrawPrimitive渲染方法和執(zhí)行緩沖。DrawP rim itive方法大大簡化了準(zhǔn)備和渲染頂點的過程,是首選的渲染方法。以下方法創(chuàng)建IDirect3DDevice9對象: RESULT IDirect3D9:CreateDevice( DINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9* ppReturnedDeviceInterface ); hr=pD3D-CreateDevice(D3DADAPTER_ DEFAULT, dwDevType, hwnd, dwBehaviorFlags, &m_d3dpp,如_pd3dDevice):3.6使用設(shè)備3.6.1設(shè)備枚舉 我們讓程序?qū)λ褂玫挠布M行查詢,這樣就可以確定它支持哪種Direct3D設(shè)備。3.6.2選擇一個被枚舉的設(shè)備 對于設(shè)備的選擇,主要基于以下考慮:n 放棄所有不適合當(dāng)前顯示深度的設(shè)備。n 放棄所有明暗處理三角形的設(shè)備。n 如果一個硬件設(shè)備符合第一和第二點,那么就使用這個設(shè)備。但是如果程序正處于debug模式,那么它不會使用硬件設(shè)備。3.6.3創(chuàng)建一個Direct3D設(shè)備 創(chuàng)建一個設(shè)備時,必須要選擇Direct3D程序使用執(zhí)行緩沖或DrawPdmitive方法。這一選擇將決定在創(chuàng)建一個設(shè)備時程序需要獲得哪種類型的接口指針。如果選擇使用執(zhí)行緩沖,那么程序就必須得到一個指向舊irect3Ddevice接口的指針。如果選擇DrawPrimitive方法,程序必須得到一個指向IDirect3DDevice3接口的指針。第4章 仿真實現(xiàn)4渲染通道 3D場景是怎樣顯示在屏幕上的呢?渲染通道負責(zé)創(chuàng)建由3D空間幾何描述和透視矩陣所指定的虛擬攝像機所給定幾何描述的2D圖形,即是我們眼睛在顯示屏幕上所見的景象。4.1模型表示 場景是對象和模型的集合,對象可看作是相鄰三角網(wǎng)格,網(wǎng)格的三角形是我們建模時對象的組成塊,我們將三角形歸為以下可互換的術(shù)語:多邊形、簡單幾何體、幾何網(wǎng)格。多邊形的某兩邊交點成為頂點,指定三頂點的位置便可以描述一個三角形。4.1.1頂點模式 上述的頂點定義在數(shù)學(xué)上是正確的,但當(dāng)我們在Direct3D運用該概念時,它顯得不夠完整。因為Direct3D中的頂點可能有指定位置之外的附加屬性。例如,頂點擁有顏色和法線等。Direct3D在構(gòu)造頂點格式方面給予我們很大的靈活性,換句話說,讓我們可定義頂點的其他屬性。 創(chuàng)建自定義的頂點格式時,我們首先創(chuàng)建包含我們所需的頂點屬性的結(jié)構(gòu)。例如頂點位置和顏色。Struet ColorVertex Float _x,_y,_z; /位置 Dword_color; /顏色 一旦頂點結(jié)構(gòu)創(chuàng)建完成,我們需要結(jié)合柔性頂點格式(FVF)來描述我們創(chuàng)建頂點格式的方法。#define FvF_COLOR(D3DFV_XYZ|D3DFvF_DIFFUSE) 必須提醒注意的是,指定的柔性頂點標(biāo)識必須和指定的頂點結(jié)構(gòu)中的數(shù)據(jù)一致。4.1.2三角形 三角形是3D對象中的基本構(gòu)成塊。要創(chuàng)建對象,就必須創(chuàng)建三角形序列以描述對象的外形和輪廓。三角形序列包括我們想呈現(xiàn)的每個單獨三角型的數(shù)據(jù)。例如,要創(chuàng)建一個矩形,我們將其分為兩個三角形。圖4.14.1.3頂點索引 組成3D對象的三角形之間很多頂點是重復(fù)的,這會增加模型的細節(jié)和復(fù)雜程度。要解決這一問題我們需要用到索引這個概念:我們創(chuàng)建一個頂點序列和一個索引序列。頂點序列包括不同頂點的數(shù)據(jù),索引序列包括頂點序列的索引數(shù)據(jù),索引數(shù)據(jù)定義了這些三角形是怎樣相互連接。4.2虛擬攝像機攝像機指定了觀看者所能看見的空間范圍,即是我們需要為多大范圍的3D物體生成2D圖像。攝像機擁有空間位置和方向并定義了可見范圍。以下是攝像機的模型。 可見空間由攝像機的角度和近平面及遠平面組成的平截頭體來決定。因為當(dāng)把顯示屏目看作矩形時,用平截頭體來表示顯得更加容易理解。不在該范圍內(nèi)的對象是不可見的。 簡單的設(shè)置虛擬攝像機的方法如下:首先,創(chuàng)建左手投影矩陣:圖5.34.3渲染通道一旦我們描述了3D幾何場景并設(shè)置了虛擬攝像機。我們的工作便是在顯示屏上生成ZD圖像。簡單的渲染路徑如下:圖5.44.3.1本地坐標(biāo) 本地坐標(biāo),或者說是模型空間,是定義對象三角形序列的坐標(biāo)系。本地坐標(biāo)用處在于它的建模過程簡單。圍繞其本地坐標(biāo)系建模比直接在世界坐標(biāo)中建模容易得多,本地坐標(biāo)允許我們在不需要特別指定其位置、大小、方向的情況下構(gòu)造模型。在渲染通道最初,還沒有進行任何變換,所以一個模型的所有頂點都是相對于一個本地坐標(biāo)系來說明的。4.3.2世界坐標(biāo)當(dāng)我們需要創(chuàng)建不同模型時,由于每個對象圍繞其本地坐標(biāo)系創(chuàng)建,這時需要將他們?nèi)哭D(zhuǎn)換到一個全局的坐標(biāo)系中,這是一個名為世界變換的過程。包括平移、旋轉(zhuǎn)、和縮放操作,涉及到對象在世界坐標(biāo)系中的位置、方向和模型大小。將本地坐標(biāo)系模型轉(zhuǎn)換到世界坐標(biāo)系的簡單過程如下:D3DXATRIX matworld:D3DXMATRIX matseale;D3DXMATRIX matTrans:D3DXMatrixsealing(&Matseale,1.0f,/模型在本地坐標(biāo)系的x軸大小1.0f, /模型在本地坐標(biāo)系的y軸大小1.0f ) ; /模型在本地坐標(biāo)系的z軸大小/天空位置D3DXMatrixTranslation(&matTrans,30.0f, /模型在世界坐標(biāo)系的x坐標(biāo)60.0f, /模型在世界坐標(biāo)系的y坐標(biāo)10.0f): /模型在世界坐標(biāo)系的z坐標(biāo)/平移,大小轉(zhuǎn)換到世界坐標(biāo)系D3DXMatrixMultiply(&Matworld,&MatTrans,&Matseale);4.3.3觀察坐標(biāo)系 我們將攝像機轉(zhuǎn)換到世界坐標(biāo)系并將其旋轉(zhuǎn)以保證它朝z軸正方向俯視。觀察坐標(biāo)系根據(jù)攝像機的位置攝像機空間的原點和方向重定位世界中的所有物體。 D3DXMTRIX matView; D3DXMatrixLookAtLH(&MatView, /存放結(jié)果的地址 &vFromPt, /Camera位置 &vLookatPt, /Camera方向 &vUpvec):; /y方向4.3.4背面揀選 背面揀選其實是一個很簡單的概念。就是:所有的三角形面,面向我們的面將會被渲染出來(可見),否則將不被渲染(不可見,被揀選出來了)。舉個例子:假如空間中有一個正方形面(要想象成一塊方形紙片),我們把正面涂成紅色,背面涂成藍色,你把它拿在手里,如果你沒有弄彎它,那你始終只會看見面向你的那個面,而不會看見它背面(有透視眼者另當(dāng)別論)。那么這個“背面揀選”在Direct3D中有什么用呢?假如我們創(chuàng)建了一個封閉的立方體(要想象成一個方紙盒),那末里面的六個面將不會被我們看見,所以,也不用被渲染?!氨趁鎾x”將使渲染更有效率。 那么怎么知道那個面被渲染而哪個面被揀選(不渲染)呢?一切都在你定義的頂點的順序上。如果你定義的三角形是順時針的,將會被渲染出來;但如果你把它翻過來,那它就變成逆時針的了,就不會被渲染出來。嗯,其實你可以指定哪個面將被揀選,順時針或逆時針,但是Direct3D默認是揀選逆時針的三角形。4.3.4投影坐標(biāo)系 投影變換將視棱錐轉(zhuǎn)變?yōu)橐粋€立方體。因為視棱錐的近端比遠端小,所以這就產(chǎn)生了離攝像機近的物體被放大的效果,這就是透視如何被應(yīng)用于場景的。在透視變換中,x和y方向的邊界值是一1和1。Z方向的邊界值分別是,0對應(yīng)于前平面,1對應(yīng)于后平面。這個矩陣根據(jù)指定的從攝像機到近裁剪平面的距離,平移并縮放物體。 D3DXMATRIX matProj: D3DXMatrixPerspeetiveFovLH(&matProj, D3Dx_PI/4, /y向可見的角度范圍 800.0f/600.0f, /平截頭體長寬之比 0.lf, /近平面距離 500.0f); /遠平面距離g_pd3dDeviceSetTransfom(D3DTS_PR叮ECTION,&matProj);g_pd3dDevieeSetTransfom(D3DTS_WORLD,&matworld);4.3.5視口變換 從概念上來將,一個視口就是一個二維的矩形,一個三維場景投影在這個舉行中。投影變換將頂點變換到視口使用的坐標(biāo)系統(tǒng)中。在Direct3O中,可以用視口來聲明下面列出的特性:v 用來限制渲染的屏幕空間視口(screen-space viewport)v 背景材質(zhì)(backgroundmaterial)。視口可以清空為這一材質(zhì)顏色v 后臺深度緩沖(background depth buff),用來在渲染場景之前初始化z-buff 裁剪空間是用來定義要顯示到渲染目標(biāo)表面上的部分場景的區(qū)域。如果選擇的視口太小,使得場景中的一部分不可見,那么就應(yīng)該裁剪掉不可見的部分,以免系統(tǒng)再渲染這一部分。4.4Direct3D中的圖形顯示4.4.1頂點和索引緩存 頂點和索引緩存使用近似的方法和接口;頂點緩存只是包含頂點數(shù)據(jù)的相鄰內(nèi)存區(qū)域,類似的,頂點緩存是包含索引數(shù)據(jù)的相鄰內(nèi)存區(qū)域。因為頂點和索引數(shù)據(jù)可以放在顯存中,所以我們用頂點緩存和索引緩存來保持?jǐn)?shù)據(jù),在顯存中渲染數(shù)據(jù)比在系統(tǒng)內(nèi)存中效率高得多。4.4.2創(chuàng)建頂點和索引緩存HRESULT IDireet3DDevice9:Create Vertex Buffer( UINT Length, DWORD Usage DWORD FVF, D3DPool Pool IDirect3DVertexBuffer9*PP Vertex B
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息科半年工作總結(jié)
- 腫瘤的種植性轉(zhuǎn)移
- 全國高考志愿填報:全面分析與實操指導(dǎo)報告 (家長版)
- 風(fēng)險概率精準(zhǔn)評估
- 心力衰歇家庭護理方案
- 護理百日行動
- 淘寶售后培訓(xùn)
- 幼兒園教師蒙氏數(shù)學(xué)培訓(xùn)
- 門診患者采血流程
- 血氣胸的護理
- 2025年湖南融通資源循環(huán)產(chǎn)業(yè)有限公司技能崗位招聘題庫帶答案分析
- CJ/T 340-2016綠化種植土壤
- 新能源汽車全生命周期碳足跡測算模型及減排策略
- 糧食加工消防安全管理規(guī)定
- 骨科器械的處理流程與清洗難點
- 小浣熊的課件
- 2024北京西城區(qū)五年級(下)期末語文試題及答案
- 屋頂樹脂瓦安裝合同協(xié)議
- 湖南能源集團有限公司招聘筆試題庫2025
- 美容皮膚科試題及答案
- 2025年質(zhì)量員(市政工程)專業(yè)技能練習(xí)題庫及答案(完整版)
評論
0/150
提交評論