《游戲設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書(shū)_第1頁(yè)
《游戲設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書(shū)_第2頁(yè)
《游戲設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書(shū)_第3頁(yè)
《游戲設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書(shū)_第4頁(yè)
《游戲設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(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、游戲設(shè)計(jì)課程設(shè)計(jì)指導(dǎo)書(shū)編寫(xiě):藺廣逢適用于:數(shù)字媒體專業(yè)2011.12游戲設(shè)計(jì)課程設(shè)計(jì)任務(wù)書(shū)設(shè)計(jì)時(shí)間:1周 學(xué) 分 數(shù):1.0執(zhí)筆人:范彩霞 編寫(xiě)日期:2008年10月一、課程設(shè)計(jì)目的游戲設(shè)計(jì)課程設(shè)計(jì)是數(shù)字媒體技術(shù)專業(yè)必修的實(shí)踐環(huán)節(jié)。本課程設(shè)計(jì)是游戲設(shè)計(jì)課程實(shí)踐環(huán)節(jié)的深化和延續(xù)。通過(guò)該實(shí)踐環(huán)節(jié)的訓(xùn)練,使學(xué)生能夠更加全面和系統(tǒng)的掌握游戲設(shè)計(jì)的體系結(jié)構(gòu)。通過(guò)對(duì)所做游戲的故事梗概、游戲類型以及設(shè)計(jì)制作過(guò)程中所涉及的相關(guān)技術(shù)的學(xué)習(xí)和掌握,提高學(xué)生的實(shí)踐能力以及團(tuán)隊(duì)協(xié)作能力,為在計(jì)算機(jī)游戲設(shè)計(jì)這一領(lǐng)域進(jìn)行深入研究做準(zhǔn)備。二、課程設(shè)計(jì)的內(nèi)容與要求本課程設(shè)計(jì)通過(guò)分組來(lái)進(jìn)行,每組34人。對(duì)每一個(gè)組,都必須設(shè)計(jì)和

2、實(shí)現(xiàn)一個(gè)完整的游戲,游戲的類型不限,軟件運(yùn)行環(huán)境限為Microsoft Windows,硬件平臺(tái)限為PC。在每組進(jìn)行游戲設(shè)計(jì)之前必須提供游戲文檔說(shuō)明,包括游戲的故事情節(jié)、游戲的類型、游戲界面的設(shè)計(jì)等。每組設(shè)計(jì)的游戲不一定是原創(chuàng)的,但絕不能抄襲已有的游戲。每組設(shè)計(jì)的游戲需要有較為完整的情節(jié),要求能體現(xiàn)以下的基本技術(shù):提供使用鍵盤(pán)或鼠標(biāo)控制視點(diǎn)的朝向和運(yùn)動(dòng)的功能;在游戲中至少有一個(gè)人物是三維的,并且能產(chǎn)生相應(yīng)的動(dòng)畫(huà)。必須在某個(gè)場(chǎng)景中有配音或者背景音樂(lè);最好能在某一個(gè)畫(huà)面中體現(xiàn)一些特效技術(shù);必須能實(shí)時(shí)或者準(zhǔn)實(shí)時(shí)運(yùn)行。游戲設(shè)計(jì)完成后對(duì)自己所做的游戲進(jìn)行短評(píng),包括:游戲中的哪一部分是最得意的?對(duì)最初的游

3、戲設(shè)計(jì)作了哪些修改,為什么?在這個(gè)游戲項(xiàng)目的實(shí)踐中獲得的經(jīng)驗(yàn)和教訓(xùn)是什么?如果有更多的時(shí)間下一步會(huì)怎么做?三、課程設(shè)計(jì)的報(bào)告(論文、作業(yè))的要求 課程設(shè)計(jì)報(bào)告是課程設(shè)計(jì)過(guò)程的整理和總結(jié)。因此,編寫(xiě)課程設(shè)計(jì)報(bào)告是課程設(shè)計(jì)階段的一個(gè)重要組成部分。課程設(shè)計(jì)報(bào)告的內(nèi)容和要求根據(jù)設(shè)計(jì)內(nèi)容而定,對(duì)于本課程設(shè)計(jì),主要應(yīng)包括以下內(nèi)容:封面:封面上應(yīng)標(biāo)明“游戲設(shè)計(jì)課程設(shè)計(jì)”報(bào)告、專業(yè)、姓名、學(xué)號(hào)與時(shí)間等;課程設(shè)計(jì)報(bào)告內(nèi)容主要包括:(1)課程設(shè)計(jì)的目的;(2)課程設(shè)計(jì)的內(nèi)容:主要包括:游戲的故事摘要 ;游戲的類型;各成員的分工;制作工具;流程圖以及如何玩這個(gè)游戲。重點(diǎn)寫(xiě)明設(shè)計(jì)思想,制作步驟、制作過(guò)程中出現(xiàn)的問(wèn)題、

4、解決方案等;(3)總結(jié):總結(jié)成功之處與問(wèn)題所在,自己通過(guò)本次課程設(shè)計(jì)有什么收獲和感悟。四、課程設(shè)計(jì)考核與成績(jī)?cè)u(píng)定根據(jù)學(xué)生的實(shí)驗(yàn)準(zhǔn)備、操作能力、實(shí)驗(yàn)結(jié)果、實(shí)驗(yàn)報(bào)告質(zhì)量、實(shí)驗(yàn)紀(jì)律等綜合評(píng)定實(shí)驗(yàn)成績(jī)。(1)總分100分:其中考勤10分,作品50分,課程設(shè)計(jì)報(bào)告40分;(2)考勤每天上、下午1次,每次2分;(3)如發(fā)現(xiàn)有嚴(yán)重抄襲者,個(gè)人成績(jī)以零分計(jì);(4)課程設(shè)計(jì)報(bào)告以準(zhǔn)確、規(guī)范、認(rèn)真等指標(biāo)進(jìn)行打分,不得抄襲,否則總成績(jī)按零分計(jì)。五、課程設(shè)計(jì)紀(jì)律及注意事項(xiàng)(1)每位參加課程設(shè)計(jì)的同學(xué)必須認(rèn)真對(duì)待,積極參加;(2)從嚴(yán)要求自己,不隨意遲到、早退和曠課,有事需例行請(qǐng)假手續(xù),實(shí)驗(yàn)室內(nèi)不得玩計(jì)算機(jī)游戲;(3)

5、在課程設(shè)計(jì)中應(yīng)積極發(fā)揮個(gè)人主觀能動(dòng)性,勤于思考,虛心向指導(dǎo)教師、實(shí)驗(yàn)室教師請(qǐng)教,服從實(shí)驗(yàn)室教師的安排;(4)愛(ài)護(hù)實(shí)驗(yàn)室的所有財(cái)產(chǎn),不得私自刪除機(jī)器上系統(tǒng)文件;(5)保持實(shí)驗(yàn)室的整潔衛(wèi)生。凡違反課程設(shè)計(jì)紀(jì)律者,指導(dǎo)教師或?qū)嶒?yàn)室教師有權(quán)進(jìn)行批評(píng)教育或終止其課程設(shè)計(jì),成績(jī)以零分記。DirectX初級(jí)教程1. 開(kāi)發(fā)環(huán)境32. 3D基本概念32.1 幾種顏色的變量類型及其相關(guān)函數(shù)應(yīng)注意區(qū)分:32.2 材質(zhì)42.3 向量42.4 光源42.5 攝像機(jī)(camera)43. 創(chuàng)建D3D設(shè)備53.1 Direct3DCreate9 ( )53.2 CreateDevice ( )53.3 基本變量53.4 其

6、他要調(diào)用的函數(shù)及變量(調(diào)用次數(shù)較少)54. 基本渲染頂點(diǎn)64.1  定義頂點(diǎn)格式和;64.2 創(chuàng)建頂點(diǎn)緩沖區(qū)并填充之;64.3D3D進(jìn)行渲染;75. 使用頂點(diǎn)索引緩沖區(qū)85.1 創(chuàng)建頂點(diǎn)索引緩沖區(qū)并填充之85.2 將頂點(diǎn)索引緩沖區(qū)設(shè)置到渲染管道流水線96. 攝像機(jī)106.1 D3D中使用的幾種常用的向量106.2D3D相機(jī)中使用的幾種常用的關(guān)于向量的函數(shù)106.3點(diǎn)和向量的區(qū)別116.3 Camera相機(jī)矩陣計(jì)算問(wèn)題117.基本紋理應(yīng)用127.1 紋理尺寸127.2 紋理坐標(biāo)127.3 基本紋理添加步驟以及所使用的函數(shù)128.模型加載141.裝載模型142.填充紋理和材質(zhì)143.渲染

7、141. 開(kāi)發(fā)環(huán)境注意,一定要把新加的SDK路徑移動(dòng)到目錄列表的最上方,因?yàn)閂C是按順序搜索路徑的。最基本的DX定義規(guī)范:I開(kāi)頭的是接口;D3D開(kāi)頭的一般是定義的一些結(jié)構(gòu);D3DX是封裝了操作的擴(kuò)展結(jié)構(gòu);2. 3D基本概念2.1 幾種顏色的變量類型及其相關(guān)函數(shù)應(yīng)注意區(qū)分:D3DCOLOR、D3DXCOLOR、D3DCOLORVALUE。注意:1. D3DCOLOR屬于DWORD型的變量,其定義包含在d3d9types.h文件中;2. D3DXCOLOR屬于結(jié)構(gòu)體類型,其定義包含在d3dx9math.h中:typedef struct D3DXCOLOR  FLOAT r;

8、FLOAT g; FLOAT b; FLOAT a; D3DXCOLOR; / r, g, b, a的范圍在0.0f-255.0f之間3. D3DCOLORVALUE同屬于結(jié)構(gòu)體類型,其定義包含在d3d9types.h文件中:typedef struct _D3DCOLORVALUE  float r; float g; float b; float a; D3DCOLORVALUE; / r, g, b, a的范圍在0.0f-1.0f之間與各個(gè)變量相對(duì)應(yīng)的函數(shù)或宏也包含在與變量相對(duì)應(yīng)的頭文件中(帶有x的變量其對(duì)應(yīng)

9、頭文件也包含x,方便記憶)。下邊介紹相關(guān)函數(shù)及宏。1. 與D3DCOLOR相對(duì)應(yīng)的宏有以下4個(gè):1. #define D3DCOLOR_ARGB(a , r, g, b) (D3DCOLOR)(a)&0xff)<<24)|(r)&0xff)<<16)|(g)&0xff)<<8)|(b)&0xff)2. #define D3DCOLOR_RGBA(r, g, b, a) D3DCOLOR_ARGB(a,r,g,b)3. #define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

10、其中該宏的Alpha值定義為255,完全不透明。4. #define D3DCOLOR_COLORVALUE(r,g,b,a) D3DCOLOR_RGBA(DWORD)(r)*255.f),(DWORD)(g)*255.f),(DWORD)(b)*255.f), (DWORD)(a)*255.f)前三個(gè)宏的r,g,b,a值均為整型數(shù),最后一個(gè)必須是從0.0到1.0的浮點(diǎn)型數(shù)。2.2 材質(zhì)材質(zhì)的定義是:材質(zhì)typedef struct _D3DMATERIAL9 D3DCOLORVALUE Diffuse; / 漫反射光D3DCOLORVALUE Ambient; / 環(huán)境光,理解為整

11、體亮度D3DCOLORVALUE Specular; / 鏡面反射,一般用于光滑的平面D3DCOLORVALUE Emissive; / 放射光,一般用于自發(fā)光體(太陽(yáng)、燈) 對(duì)于材質(zhì)設(shè)置,自發(fā)光不應(yīng)太強(qiáng)。float Power; / 指定鏡面高光的強(qiáng)度 D3DMATERIAL9;2.3 向量typedef struct _D3DVECTOR   float  x, y, z; D3DVECTOR; 該定義包含在d3d9types.h頭文件中。2.4 光源typedef struct _D3DLIGHT9  D3DLIGHTTYPE Type; / 光源

12、類型,有點(diǎn)光源、聚焦光源、方向光源3種 D3DCOLORVALUE Diffuse; / 漫反射光顏色D3DCOLORVALUE Specular; / 鏡面反射光顏色D3DCOLORVALUE Ambient; / 環(huán)境光顏色D3DVECTOR Position; / 光源位置(對(duì)方向光源無(wú)效,如果創(chuàng)建方向光源可忽略)D3DVECTOR Direction; / 方向(對(duì)點(diǎn)光源無(wú)效,如果創(chuàng)建點(diǎn)光源無(wú)效可忽略。可以是非單位向量,但是不能是0向量)float Range; / 光的范圍,就是能照多遠(yuǎn)(對(duì)方向光無(wú)效,如果創(chuàng)建方向光源可忽略)float Falloff; / 聚光內(nèi)外光圈的

13、徑向強(qiáng)度衰減,一般為1.0f (只針對(duì)聚焦光源)float Attenuation0; / 距離衰減0(創(chuàng)建方向光源可忽略,非方向光源一般3個(gè)距離衰減均取取0.0f)float Attenuation1; / 距離衰減1(創(chuàng)建方向光源可忽略,非方向光源一般3個(gè)距離衰減均取取0.0f)float Attenuation2; / 距離衰減2(創(chuàng)建方向光源可忽略,非方向光源一般3個(gè)距離衰減均取取0.0f)float Theta; / 指定聚光內(nèi)圈的夾角大?。?-Phi)(只針對(duì)聚焦光源) float Phi; / 指定聚光外圈的夾角大?。?-pi)(只針對(duì)聚焦光源) D3DLIGHT9;注:1. 這

14、里非方向光源指 點(diǎn)光源 和 聚焦光源。2. 添加光照并開(kāi)啟光照,而且必須為模型或面添加了法向量及材質(zhì),光源才起作用。 即光照三要素:光照、材質(zhì)、法向量。2.5 攝像機(jī)(camera)攝像機(jī)的確定有兩個(gè)主要參數(shù):一個(gè)位置和一個(gè)方向。將攝像機(jī)設(shè)置到場(chǎng)景中要用到SetTransform( D3DTS_VIEW, &m_matView ); / m_matView就是攝象機(jī)的觀察矩陣。3. 創(chuàng)建D3D設(shè)備所需的主要的2個(gè)函數(shù)和3個(gè)變量(其余函數(shù)根據(jù)所需變量的填充要求而定)3.1 Direct3DCreate9 ( )其原型為IDirect3D9  * Direct3DCreate9

15、(   UINT SDKVersion ); SDKVersion為SDK版本值,函數(shù)及SDKVersion的定義包含在d3d9.h中,編譯過(guò)程中需要d3d9.lib鏈接庫(kù)。3.2 CreateDevice ( )HRESULT  CreateDevice ( UINT Adapter,      D3DDEVTYPE DeviceType, HWND hFocusWindow,      DWORD BehaviorFlag

16、s,      D3DPRESENT_PARAMETERS *pPresentationParameters,     IDirect3DDevice9* ppReturnedDeviceInterface );參數(shù)解釋:UINT Adapter 一般使用D3DADAPTER_DEFAULT代表主適配器(即顯示器);D3DDEVTYPE DeviceTypeD3DDEVTYPE_HAL代表使用硬件加速方式,D3DDEVTYPE_REF代表使用軟件仿真方式;HWND 

17、hFocusWindow代表要?jiǎng)?chuàng)建D3D設(shè)備的窗口的句柄    DWORD BehaviorFlags處理標(biāo)識(shí):最常用的選項(xiàng)有 D3DCREATE_HARDWARE_VERTEXPROCESSING硬件處理 D3DCREATE_SOFTWARE_VERTEXPROCESSING軟件處理D3DCREATE_MIXED_VERTEXPROCESSING軟硬件結(jié)合處理D3DPRESENT_PARAMETERS *pPresentationParameters描述設(shè)備顯示參數(shù)的結(jié)構(gòu)體,一般要調(diào)用其他函數(shù)來(lái)填充該結(jié)構(gòu)體;IDirect3DDev

18、ice9* ppReturnedDeviceInterface用于返回D3D的設(shè)備對(duì)象指針。3.3 基本變量 D3DCAPS9、D3DDISPLAYMODE、D3DPRESENT_PARAMETERS三個(gè)比較基本的變量,用于描述顯示設(shè)備創(chuàng)建時(shí)的相關(guān)參數(shù)。3.4 其他要調(diào)用的函數(shù)及變量(調(diào)用次數(shù)較少) HRESULT  GetDeviceCaps(   UINT Adapter,     D3DDEVTYPE DeviceType,     D3DCAPS9

19、 *pCaps); HRESULT  GetAdapterDisplayMode(  UINT Adapter,     D3DDISPLAYMODE *pMode);UINT  GetAdapterCount( VOID );4. 基本渲染頂點(diǎn)渲染的基本步驟是這樣的:4.1  定義頂點(diǎn)格式和; 頂點(diǎn)格式必須與FVF中定義的一致,這樣流水線才能識(shí)別。如:struct CUSTOMVERTEX  FLOAT x, y, z; / 頂點(diǎn)坐標(biāo) DWORD color; /

20、 頂點(diǎn)顏色;與之相對(duì)應(yīng)的FVF為藍(lán)色部分。#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)4.2 創(chuàng)建頂點(diǎn)緩沖區(qū)并填充之; 使用的基本函數(shù)有:1. CreateVertexBuffer(); HRESULT CreateVertexBuffer(   UINT Length,     DWORD Usage,     DWORD FVF,    

21、 D3DPOOL Pool,     IDirect3DVertexBuffer9* ppVertexBuffer,     HANDLE* pHandle);UINT Length用來(lái)指定頂點(diǎn)緩沖區(qū)的大?。籇WORD Usage一般設(shè)置為0;DWORD FVF自定義可變頂點(diǎn)格式;D3DPOOL Pool可用D3DPOOL _DEFAULT = 0 (一般用這個(gè)比較多),D3DPOOL_MANAGED = 1, &#

22、160;   D3DPOOL_SYSTEMMEM = 2,     D3DPOOL_SCRATCH = 3,IDirect3DVertexBuffer9* ppVertexBuffer指向頂點(diǎn)緩沖區(qū)COM對(duì)象的指針。HANDLE* pHandle 一般設(shè)置為NULL。2. Lock() HRESULT Lock( UINT OffsetToLock,     UINT SizeToLock,    

23、; VOID *ppbData,     DWORD Flags);UINT OffsetToLock,鎖定區(qū)域偏移量,一般為0;     UINT SizeToLock, 要鎖定區(qū)域的大?。?#160;    VOID *ppbData, 返回指向緩沖區(qū)數(shù)據(jù)的指針;     DWORD Flags 鎖定行為標(biāo)識(shí)符,一般設(shè)置為0;3. memcpy( )(用此函數(shù)將計(jì)算好的數(shù)據(jù)拷貝進(jìn)緩沖

24、區(qū)),如memcpy(in,out,sizeof(buffer);4. HRESULT Unlock(VOID); 解除對(duì)數(shù)據(jù)區(qū)的鎖定,一邊流水線渲染可以正常執(zhí)行。4.3 D3D進(jìn)行渲染;有兩個(gè)基本函數(shù):1. SetStreamSource()用于將頂緩沖區(qū)設(shè)置到流水線中; HRESULT SetStreamSource(    UINT StreamNumber,     IDirect3DVertexBuffer9 *pStreamData,  

25、60;  UINT OffsetInBytes,     UINT Stride ); UINT StreamNumber 一般設(shè)置為0;IDirect3DVertexBuffer9 *pStreamData 指向頂點(diǎn)緩沖區(qū)COM對(duì)象的指針;     UINT OffsetInBytes 指針偏移量不偏移則取0;     UINT Stride 頂點(diǎn)跨距,即每個(gè)頂點(diǎn)所占的字節(jié)數(shù)2. SetFVF()用于將頂

26、點(diǎn)自定義格式傳遞給流水線。注:IDirect3DDevice9:SetFVF(Vertex:FVF) FVF保存著頂點(diǎn)描述,F(xiàn)VF的定義形式如下: #define FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)或  DWORD const dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE ); D3DFVF_XYZ:表示頂點(diǎn)格式中包含頂點(diǎn)坐標(biāo)信息。它告知系統(tǒng)你的游戲沒(méi)有變換過(guò)頂點(diǎn),要求Direct3D來(lái)做頂點(diǎn)的變換工作。 D3DFVF_XYZRHW:告知系統(tǒng)你的游戲引擎已對(duì)頂點(diǎn)作過(guò)

27、變換,Direct3D不需要再對(duì)它們作變換。也就是說(shuō),Direct3D就不會(huì)再用世界矩陣、觀察矩陣或投射矩陣來(lái)變換頂點(diǎn)了。 D3DFVF_DIFFUSE:表示頂點(diǎn)格式中包含了一個(gè)漫反射顏色信息。 D3DFVF_SPECULAR:表示頂點(diǎn)格式中包含一個(gè)鏡面反射顏色成分。 D3DFVF_NORMAL:表示頂點(diǎn)格式中包含有頂點(diǎn)朝向信息(即法線向量)。 D3DFVF_TEX0 D3DFVF_TEX8:包含頂點(diǎn)格式坐標(biāo)的個(gè)數(shù)(1-8個(gè))。 例如: typedef struct SObjVertex FLOAT x, y, z; / position FLOAT nx, ny, nz; / normal

28、DWORD diffuse; / diffuse color DWORD specular; / specular color FLOAT tu, tv; / first pair of texture coordinates FLOAT tu2, tv2, tw2; / second pair of texture coordinates FLOAT tu3, tv3; / third pair of texture coordinates FLOAT tu4, tv4; / fourth pair of texture coordinates SObjVertex; const DWORD

29、 gSObjVertexFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_NORMAL | D3DFVF_TEX4 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1) | D3DFVF_TEXCOORDSIZE2(2) | D3DFVF_TEXCOORDSIZE2(3);   IDirect3DDevice9:DrawPrimitive: HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT S

30、tartVertex, UINT PrimitiveCount ); PrimitiveType:定義了要使用的圖元的類型。共有六種: typedef enum D3DPRIMITIVETYPE D3DPT_POINTLIST = 1, /點(diǎn),圖元個(gè)數(shù)N D3DPT_LINELIST = 2,/線,圖元個(gè)數(shù)為N/2 D3DPT_LINESTRIP = 3,/ D3DPT_TRIANGLELIST = 4, D3DPT_TRIANGLESTRIP = 5, D3DPT_TRIANGLEFAN = 6, D3DPT_FORCE_DWORD = 0x7fffffff, D3DPRIMITIVETYP

31、E, *LPD3DPRIMITIVETYPE; StarVertex:設(shè)置從頂點(diǎn)緩沖區(qū)中的第幾個(gè)頂點(diǎn)畫(huà)起。 PrimitiveCount:要繪畫(huà)的圖元的數(shù)量。 3. DrawPrimitive() HRESULT DrawPrimitive(   D3DPRIMITIVETYPE PrimitiveType, 圖元類型     UINT StartVertex, 起始頂點(diǎn)     UINT PrimitiveCount 要繪制的圖元個(gè)數(shù));完成上

32、述過(guò)程就可以對(duì)定點(diǎn)進(jìn)行渲染了。渲染函數(shù)DrawPrimitive()不對(duì)頂點(diǎn)的格式進(jìn)行再次檢查:比如同一個(gè)緩沖區(qū)可以,你本來(lái)打算是用來(lái)畫(huà)三角形列表,但也可以畫(huà)直線,或者三角形帶、扇形等,函數(shù)不會(huì)再次檢查。5. 使用頂點(diǎn)索引緩沖區(qū)在一個(gè)3D模型中一個(gè)點(diǎn)可能要同時(shí)處于多個(gè)三角形面上,如果直接把頂點(diǎn)數(shù)據(jù)放進(jìn)緩沖區(qū),那么重復(fù)的頂點(diǎn)就會(huì)占用多余的內(nèi)存。使用頂點(diǎn)緩沖區(qū)把頂點(diǎn)的具體數(shù)據(jù)和代表三角形的頂點(diǎn)的索引分開(kāi)存儲(chǔ),頂點(diǎn)數(shù)據(jù)還是放到頂點(diǎn)緩沖區(qū)中,頂點(diǎn)索引存儲(chǔ)在頂點(diǎn)索引緩沖區(qū)中,這樣可以節(jié)省不少內(nèi)存,避免點(diǎn)的重復(fù)存儲(chǔ)。5.1 創(chuàng)建頂點(diǎn)索引緩沖區(qū)并填充之使用到的函數(shù):1. HRESULT Creat

33、eIndexBuffer(    UINT Length,    DWORD Usage,      D3DFORMAT Format,     D3DPOOL Pool,     IDirect3DIndexBuffer9* ppIndexBuffer,      HANDLE* pHandle ); 用于創(chuàng)建頂點(diǎn)索

34、引緩沖區(qū)UINT Length 頂點(diǎn)索引緩沖區(qū)的大小,有多少個(gè)索引,就有多少個(gè)頂點(diǎn)的字節(jié)大?。?#160;   DWORD Usage 可以置為0;    D3DFORMAT Format D3DFMT_INDEX16,D3DFMT_INDEX32分別表示用16位(可存儲(chǔ)65536個(gè)頂點(diǎn)),32位存(可存儲(chǔ)65536*65536個(gè)頂點(diǎn))儲(chǔ)索引值。     D3DPOOL Pool 可取D3DPOOL_DEFAULT;    

35、IDirect3DIndexBuffer9* ppIndexBuffer 頂點(diǎn)索引緩沖區(qū)的COM對(duì)象指針;    HANDLE* pHandle 一般值為NULL; 2. HRESULT  Lock(   UINT OffsetToLock,     UINT SizeToLock,     VOID *ppbData,     DWORD Fla

36、gs ); 用于鎖定頂點(diǎn)索引緩沖區(qū)并返回索引數(shù)據(jù)區(qū)指針; UINT OffsetToLock 鎖定偏移量,一般設(shè)置為0;     UINT SizeToLock 頂點(diǎn)索引緩沖區(qū)的字節(jié)數(shù),等于頂點(diǎn)索引個(gè)數(shù) * 索引位深 / 8;     VOID *ppbData 返回指向頂點(diǎn)索引緩沖數(shù)據(jù)區(qū)的指針,以便數(shù)據(jù)復(fù)制;     DWORD Flags 一般設(shè)置為0;3. HRESULT  Unlock (VOID);用于解除頂點(diǎn)索引緩

37、沖區(qū)區(qū)注意:一般手動(dòng)填充頂點(diǎn)索引緩沖區(qū),因?yàn)槟菐讉€(gè)頂點(diǎn)構(gòu)成一個(gè)三角形有自己來(lái)確定;5.2 將頂點(diǎn)索引緩沖區(qū)設(shè)置到渲染管道流水線1. HRESULT  SetIndices( IDirect3DIndexBuffer9  * pIndexData );其中的pIndexData為指向頂點(diǎn)索引緩沖區(qū)COM對(duì)象的指針; 2. HRESULT DrawIndexedPrimitive(   D3DPRIMITIVETYPE Type,     INT BaseVertexI

38、ndex,     UINT MinIndex,     UINT NumVertices,     UINT StartIndex,     UINT PrimitiveCount );  D3DPRIMITIVETYPE Type, 圖元類型;     INT BaseVertexIndex, 初始頂點(diǎn)的索引值的偏移量,一般

39、為0;    UINT MinIndex, 最小頂點(diǎn)索引值,一般為0;     UINT NumVertices, 頂點(diǎn)緩沖區(qū)中的頂點(diǎn)數(shù)量;     UINT StartIndex, 起始的頂點(diǎn)索引,一般為0;     UINT PrimitiveCount 需要渲染的圖元的個(gè)數(shù);頂點(diǎn)索引緩沖區(qū)中的頂點(diǎn)順序很重要,因?yàn)槟J(rèn)情況下,流水線只繪制點(diǎn)排列順序?yàn)槟鏁r(shí)針的三角形,而不繪制排列順序?yàn)轫槙r(shí)針的三角形(可以

40、設(shè)置為NOCULL模式這樣渲染管線不裁剪)。包含D3DFVF_XYZRHW的點(diǎn)可以直接繪制在屏幕上,而不需要變換。這是因?yàn)樯梢粋€(gè)包含D3DFVF_XYZRHW屬性的VertexBuffer對(duì)象,渲染流水線會(huì)認(rèn)為改點(diǎn)已經(jīng)進(jìn)行了頂點(diǎn)變換,不要再將頂點(diǎn)數(shù)據(jù)作變換(不乘世界矩陣,視矩陣,投影矩陣)。這是繪圖時(shí)用的坐標(biāo)系可以理解為簡(jiǎn)單的屏幕坐標(biāo)系(即x正方向水平向左,y正方向豎直向下)英文:The RHW float, when set to one, indicates that the vertice are not to be transformed. This is used for GUI

41、developement. setting the RHW tells the direct3d pipeline NOT to apply any transformations matrices to them and you can think of them as pure 2d coords instead of 3d coords.6. 攝像機(jī)6.1 D3D中使用的幾種常用的向量常用的有以下幾種:1. D3DVECTOR定義在d3d9types.h頭文件中,其為結(jié)構(gòu)體,定義如下: typedef struct _D3DVECTOR  float x, y, z;

42、 D3DVECTOR; D3DVECTOR屬于3維向量。2. D3DXVECTOR2定義如下: typedef struct D3DXVECTOR2  FLOAT x; FLOAT y; D3DXVECTOR2; D3DXVECTOR2屬于2維向量。D3DXVECTOR3定義如下:typedef struct FLOAT x; FLOAT y; FLOAT z; D3DXVECTOR3; D3DXVECTOR3屬于3維向量。D3DXVECTOR4定義如下:typedef struct D3DXVECTOR4  FLOAT&#

43、160;x; FLOAT y; FLOAT z; FLOAT w; D3DXVECTOR4; D3DXVECTOR4屬于4維向量。以上三者均在d3dxmath.h中定義(記憶方法同D3DCOLOR、D3DXCOLOR)。6.2 D3D相機(jī)中使用的幾種常用的關(guān)于向量的函數(shù)1. D3DXVec3Dot ();2. D3DXVec3Normalize ();3. D3DXVec3Cross ();4. D3DXMatrixRotationAxis ();5. D3DXVec3TransformCoord ();介紹:1. FLOAT  D3DXVec3Dot

44、(  CONST D3DXVECTOR3 *pV1,CONST D3DXVECTOR3 *pV2 ); 該函數(shù)用于計(jì)算兩個(gè)三維向量的點(diǎn)乘,并返回最終結(jié)果。2. D3DXVECTOR3 * WINAPI  D3DXVec3Normalize(  D3DXVECTOR3 *pOut,     CONST D3DXVECTOR3 *pV );該函數(shù)用于計(jì)算第二個(gè)向量的單位向量(即歸一化向量),第二個(gè)參數(shù)為source即傳入向量,并將計(jì)算結(jié)果存放于第一個(gè)參數(shù)中或返

45、回。 3. D3DXVECTOR3 * D3DXVec3Cross(  D3DXVECTOR3 * pOut,     CONST D3DXVECTOR3 * pV1,     CONST D3DXVECTOR3 * pV2 ); 該函數(shù)用于計(jì)算后兩個(gè)向量的叉乘,并將結(jié)果放于第一個(gè)參數(shù)中或返回。4. D3DXMATRIX * D3DXMatrixRotationAxis ( D3DXMATRIX * pOut,  &

46、#160;  CONST D3DXVECTOR3 * pV,     FLOAT  Angle );D3DXMATRIX * pOut根據(jù)旋轉(zhuǎn)角度和轉(zhuǎn)軸計(jì)算出來(lái)的繞pV軸旋轉(zhuǎn)Angle弧度應(yīng)使用的旋轉(zhuǎn)矩陣。     CONST D3DXVECTOR3 * pV用于定義旋轉(zhuǎn)軸的向量。     FLOAT  Angle 旋轉(zhuǎn)過(guò)的弧度,因?yàn)閷?shí)在左手坐標(biāo)系中,所以順時(shí)針轉(zhuǎn)動(dòng)為正。Angles are measured clo

47、ckwise when looking along the rotation axis toward the origin5. 下面來(lái)看看D3DXVec3TransformCoord()函數(shù):D3DXVECTOR3  * D3DXVec3TransformCoord(  D3DXVECTOR3 * pOut,     CONST D3DXVECTOR3 * pV,     CONST D3DXMATRIX * pM );計(jì)算點(diǎn)pV經(jīng)過(guò)矩陣pM旋轉(zhuǎn)后的值,并將值放于p

48、Out中或返回。6.3 點(diǎn)和向量的區(qū)別坐標(biāo)和向量是有區(qū)別的:向量的第四維數(shù)值是0,坐標(biāo)的第四維數(shù)值是1;向量 = 兩個(gè)坐標(biāo)的差值 ,第四維同樣做減法,結(jié)果是0;向量的坐標(biāo)變換用D3DXVec3TransformNormal, 點(diǎn)的變換用D3DXVec3TransformCoord。D3DXVec3Transform和D3DXVec3TransformCoord相似,區(qū)別在于后者變換后將w投射回1。6.3 Camera相機(jī)矩陣計(jì)算問(wèn)題參見(jiàn)函數(shù)D3DXMatrixLookatLH()其最終計(jì)算出來(lái)的相機(jī)矩陣各個(gè)參數(shù)如下:D3DXMATRIX  * WINAPI  D3

49、DXMatrixLookAtLH(  D3DXMATRIX *pOut,     CONST D3DXVECTOR3 *pEye,     CONST D3DXVECTOR3 *pAt,     CONST D3DXVECTOR3 *pUp );RemarksThe return value for this function is the same value returned in the pOut parame

50、ter. In this way, the D3DXMatrixLookAtLH function can be used as a parameter for another function.This function uses the following formula(表達(dá)式) to compute the returned matrix.cam_pos = eye.cam_lookat = zaxis = normal(At - Eye) (在RH中為normal(Eye-At))cam_right = xaxis = normal(cross(Up, zaxis)cam_up =

51、cross(zaxis, xaxis) xaxis.x yaxis.x zaxis.x 0 xaxis.y yaxis.y zaxis.y 0 xaxis.z yaxis.z zaxis.z 0-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 17.基本紋理應(yīng)用7.1 紋理尺寸紋理都是2D的圖片,它可以保存為bmp、tga、jpg或是任何一種常見(jiàn)的圖片格式,所以它肯定有大小。雖然理論上現(xiàn)在的新型顯卡可以支持任意尺寸的紋理,不過(guò)為了兼容以前的顯卡也為了程序的執(zhí)行效率,你最好把紋理的尺寸做成的n次方。如:16 x 16, 32 x 32, 64

52、x 64, 128 x 128, 256 x 256等等。7.2 紋理坐標(biāo)紋理坐標(biāo)又叫貼圖坐標(biāo),在D3D中用兩個(gè)0到1的浮點(diǎn)值(U,V)來(lái)設(shè)置一個(gè)點(diǎn)的紋理坐標(biāo),U是橫軸、是縱軸。紋理的左上角為(0,0),右下角為(1,1)。7.3 基本紋理添加步驟以及所使用的函數(shù)1. 為頂點(diǎn)添加紋理坐標(biāo)u、v并修改頂點(diǎn)的FVF2. 定義紋理對(duì)象指針并創(chuàng)建紋理對(duì)象。 如: LPDIRECT3DTEXTURE9 ppTexture; / 定義紋理對(duì)象指針 HRESULT  D3DXCreateTextureFromFile(  LPDIRECT3DDEVICE9  pDev

53、ice,      LPCTSTR pSrcFile,       LPDIRECT3DTEXTURE9  * ppTexture ); LPDIRECT3DDEVICE9  pDevice, / 設(shè)備對(duì)象     LPCTSTR pSrcFile, / 待作為紋理的圖像名稱LPDIRECT3DTEXTURE9  * ppTexture ); / 紋理對(duì)象指針3. 將紋理設(shè)置到渲染管線并渲染1. HRESULT SetText

54、ure( DWORD Sampler, /將一張紋理指派給設(shè)備中的某個(gè)特定的階段 IDirect3DBaseTexture9 * pTexture) /紋理對(duì)象指針 SetTexture()方法將一張紋理指派給設(shè)備中的某個(gè)特定的階段。Direct3D提供了8個(gè)階段(0到7),這意味著可以為一次DrawPrimitive()調(diào)用同時(shí)設(shè)置最多8張紋理。(然而,你也可以多次調(diào)用DrawPrimitive(),這稱“多次渲染”)。SetTexture()的第一個(gè)參數(shù)中給出一個(gè)希望使用的紋理階段編號(hào)。第二個(gè)參數(shù)為紋理對(duì)象指針。當(dāng)一個(gè)應(yīng)用程序選擇了一張紋理作為當(dāng)前紋理時(shí),它就指示Direct3D設(shè)備在下一次改變當(dāng)前紋理之前,一直將該紋理應(yīng)用到所有被渲染的圖元上去。如果3D場(chǎng)景中的每個(gè)圖元都有其自己的紋理,則必需在繪制每個(gè)圖元之前設(shè)置相應(yīng)的紋理,也就是說(shuō)應(yīng)在調(diào)用DrawPrimitive()函數(shù)之前進(jìn)行紋理設(shè)置。 2. HRESULT SetTextureStageState( D

溫馨提示

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