飛行游戲設(shè)計(jì).doc_第1頁(yè)
飛行游戲設(shè)計(jì).doc_第2頁(yè)
飛行游戲設(shè)計(jì).doc_第3頁(yè)
飛行游戲設(shè)計(jì).doc_第4頁(yè)
飛行游戲設(shè)計(jì).doc_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

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

溫馨提示

  • 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)論