基于紋理動畫技術的爆炸動畫模擬_第1頁
基于紋理動畫技術的爆炸動畫模擬_第2頁
基于紋理動畫技術的爆炸動畫模擬_第3頁
免費預覽已結束,剩余16頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘要實現(xiàn)三維模型的動態(tài)效果的方法和軟件很多,本次設計選用是Direct3D,根據(jù)以前所學的廣告技術和十字交叉紋理技術將靜態(tài)的三維模型簡化我為一副二維圖片的方法,再次使用二維的圖片來代替動態(tài)的三維模型,并通過連續(xù)貼圖動畫技術實現(xiàn)三維模型的動態(tài)效果。本實驗設計采用基于紋理動畫技術的爆炸效果模擬為研究課題展開研究。實驗發(fā)現(xiàn)采用連續(xù)貼圖動畫技術實現(xiàn)動畫效果,可以節(jié)省了對系統(tǒng)的開銷,系統(tǒng)運行速度比較快,效果比較好,特別是對于爆炸這樣的瞬間,采用這種方法比較合適,但是對于持續(xù)時間比較長的動畫效果,如燃燒、噴泉、瀑布等,則比較容易露出破綻,那是我們可以采用粒子系統(tǒng)來實現(xiàn)動畫效果。關鍵詞 廣告板技術 十字交叉

2、紋理技術 連續(xù)貼圖動畫技術 粒子系統(tǒng) Direct3D 17目錄第1章 緒 論 11.1問題的提出 11.2現(xiàn)有系統(tǒng)存在問題的分析11.3系統(tǒng)開發(fā)目標 11.4實驗工具的選擇 11.5實驗的意義 2第2章 實驗的基本理論 22.1廣告板技術 22.2動畫紋理技術 3第3章 實驗設計的主體內容 43.1實驗內容介紹 43.1 實驗設計的思路 53.2實驗實現(xiàn)的主要過程與效果 5第4章 結果分析與討論9致謝 10參考文獻 10附錄一: 廣告板技術圖片實例主要的源代碼: 11附錄二: 實驗TextureAnimation.cpp的主要源代碼:13第一章 緒論本次實驗設計以廣告板技術和十字交叉紋理技術

3、將靜態(tài)的三維模型簡化為一副二維的圖片方法為背景,論述了如何通過連續(xù)貼圖動畫技術實現(xiàn)三維模型的動態(tài)效果。全文共分為緒論、實驗的基本原理、實驗設計的主題內容、結果分析與討論、總結、致謝、參考文獻、附錄等。1.1 問題的提出我們通過廣告板技術或十字交叉紋理技術將靜態(tài)的三維模型簡化為一副二維的圖片,這樣大大節(jié)省了系統(tǒng)的資源,那么我們是否可以再次使用二維的圖片來代替動態(tài)的三維模型,從而實現(xiàn)三維模型的動態(tài)效果?1.2現(xiàn)有系統(tǒng)存在的問題 在三維場景中,渲染一個三維物體是很耗資源的,然而用戶的需求是無止境的,誰都希望場景內的圖像越生動越好。但是場景中的三維物體越多,越復雜,程序的運行速度將越慢,運行效率將越低

4、,最后實現(xiàn)的效果越差。1.3系統(tǒng)開發(fā)的目標增加場景內圖像的生動程度的同時降低系統(tǒng)資源的損耗,提高程序的運行速率和效果。1.4 實驗工具的選擇Direct3D提供了一套強有力的工具來幫助我們提高三維場景的逼真度,它是微軟公司于1996年為PC開發(fā)的API,與Windows 95 、Windows NT和Power Mac操作系統(tǒng)兼容性好,可繞過圖形顯示接口(GDI)直接進行支持該API的各種硬件的底層操作,大大提高了游戲的運行速度,而且目前基本上是免費使用的。由于要考慮與各方面的兼容性,DirectX用起來比較麻煩、在執(zhí)行效率上也未見得最優(yōu),在實際3DS MAX的運用中效果一般,還會發(fā)生顯示錯誤

5、,但是比用軟件加速快。1.5本實驗的意義三維物體最重要的是渲染,當渲染多個復雜的三維圖像是能夠增加對系統(tǒng)資源的損耗,隨著系統(tǒng)資源的損耗,三維物體的實現(xiàn)效果將降低。通過本實驗可以降低對系統(tǒng)資源的損耗,實現(xiàn)對三維世界進行再一次簡化。第二章 實驗的基本理論2.1 廣告板技術當我們創(chuàng)建一個三維場景時,我們可以通過對一些看起來具有三維效果的二維對象進行渲染的方法來提高性能。公告板技術正是出于這種思想來考慮的。通常,廣告板就是指路邊的一些告示牌。Direct3D程序中,可以通過定義一個固定的矩形并對它使用紋理的方法來創(chuàng)建和渲染這樣一種公告板。三維圖形學中的廣告板就是這種廣告板的一種擴展。它的目的就是使二維

6、對象能夠看起來具有三維效果。這項技術將一幅包含了對象圖象的紋理應用到一個矩形圖元上。這個圖元隨著觀察者不斷旋轉,使它總能朝向觀察者。我們不用考慮對象的圖象是否是矩形。廣告板上的某些地方可以是透明的,這樣就能使我們不想見到的公告板圖象的某些部分變得不可見。許多游戲都對它們的動畫精靈使用公告板技術。例如,當我們在一個三維迷宮中行走時,我們可能會看到一些武器或者其他一些獎品,并且能夠拾起它們。這些物品通常都是將一些二維紋理圖象應用到一個矩形圖元上生成的。我們還經常使用公告板技術來渲染場景中的樹木和灌木叢等的圖象。當我們要將一個圖象應用到一個廣告板時,我們首先得將矩形圖元進行旋轉,使圖象能夠朝向觀察者

7、的方向。然后,程序將它平移到所需的位置。接著,就可以將紋理應用到圖元上了。廣告板技術的核心思想是:對于場景內一些不是特別重要的三維物體,我們可以退而求其次,首先創(chuàng)建一個矩形,然后將該三維物體的二維相片作為紋理賦給該矩形;同時根據(jù)觀察者點的位置,實時的旋轉該二維圖片,使它總是面向觀察點,從而用一個二維的圖片代替了這個三維網格模型。這樣一來,既節(jié)省了相當多的資源,也不使用戶感覺到失真。此外,要注意的一點是,在渲染該二維圖片時,需要進行透明處理,這樣才能使圖像后面的場景內容不被圖片中的空白部分所遮擋。廣告板技術最好能用于對稱的物體,特別是沿垂直方向對稱的物體。它還要求觀察者的水平高度不能太高,否則就

8、有可能很明顯的感覺到對象是二維的,而不是三維的。如圖為編寫的廣告板實例:(源代碼見附錄一)2.2紋理動畫技術 動畫技術也稱紋理動畫技術,我們通過使用紋理技術來產生一些特殊效果或增加真實感等。通過多紋理或多通道融合,Direct3D使程序可以細節(jié)紋理應用到圖元上。使用細節(jié)紋理,可以在表面上產生磨損的痕跡、凹凸的表面以及其他一些表面屬性。凹凸映射紋理技術可以為一個圖元創(chuàng)建具有復雜紋理的表面。特別是對于光滑的表面,效果明顯。細節(jié)紋理還可以被用作深度提示(depth cue)。例如,我們現(xiàn)在要模擬一架正在著陸的直升機。當直升機接近地面時,由于放大,地面紋理會變得模糊不清。這時,我們要區(qū)分到地面的距離就

9、會有一定困難。如果我們對地面使用了類似于沙礫等物體的細節(jié)紋理,我們就可以獲得足夠的深度提示來正確的操縱降落的直升機。如果觀察者遠離圖元,我們大概不會想得到很多的細節(jié)展示。但要注意,當程序不使用細節(jié)紋理時,圖元可能會看起來更加明亮一些。這時,我們可以通過使用一個光線映射紋理使圖元變暗來進行補償。它的內容其核心思想與廣告板技術或十字交叉紋理技術有類似的地方:首先創(chuàng)建一個矩形,并為這個矩形創(chuàng)建一個紋理數(shù)組,將該三維物體運動時的一系列二維圖片作為該紋理數(shù)組的每個元素,按先后次序存放到數(shù)組中。然后按照一定的時間間隔,連續(xù)的切換矩形的紋理。當時間間隔很小,且圖片之間的差異較小時,這些連續(xù)的圖片就可以實現(xiàn)三

10、維模型的運動效果。事實上,連續(xù)貼圖動畫就是將多幅連續(xù)的圖像按照一定的順序以一定的時間間隔顯示出來。例如,圖1所示的是模擬爆炸效果的16幅圖像,我們將這16副圖像逐次顯示出來,并采用透明紋理映射技術就可以模擬出爆炸過程這一特殊效果。 圖17.1 連續(xù)貼圖動畫示例第三章 實驗設計的主題內容3.1實驗內容的介紹是利用化工技術表現(xiàn)出的效果,在特殊效果領域中占很重要的地位。一般用爆破Miniature或用CG合成渲染影像,跟其它部分連起來使用。因火藥的制作方法不同,火焰的形態(tài)和顏色也不同。炸藥的安裝位置和用量決定爆炸時場面的形態(tài)。因此這是相當依賴經驗和理論的專業(yè)領域。在互聯(lián)網中查找跟Pyrotechni

11、c有關的站點就很容易找到詳細說明爆破效果理論的主頁。拍攝真正的爆破場面不是件容易的事情。因此利用裝有Real Motion, Pyromania, Fire Effect等爆破場面的CD-ROM或 Max的After Burn, Light Wave的Hyper Boxell等也是一種辦法。Hyper Boxell或 After Burn是應用Volume Metric和Shaer的插件。因此使用得當,就能得到非常逼真的效果。特別是After Burn, 在電影“Armageddon(絕世天劫,華納,1998)”中用過,很有名氣。但是After Burn 的渲染時間比Hyper Boxell慢

12、得多,質量方面因很久沒有做過比較,不能斷定,可能不相上下。爆破效果的引入會使我們設計的三維動畫效果更加出色。所以我們就以爆炸效果為實驗目標,對紋理動畫技術進行改進。3.2實驗設計思路設置入口函數(shù)應用程序的相關初始化檢查設備能力修改Direct3D渲染設備設置創(chuàng)建管理內存資源對象創(chuàng)建默認內存類型資源對象更新場景渲染文本各種信息的處理3.2實驗實現(xiàn)的主要過程與效果我們通過程序TextureAnimation.cpp進行如何在Direct3D中用連續(xù)貼圖動畫技術實現(xiàn)三維模型的運動效果的實驗。該程序使用25副連續(xù)貼圖實現(xiàn)了爆炸動畫效果。其中使用連續(xù)貼圖動畫技術的核心步驟有兩步。第一步,創(chuàng)建用來播放連續(xù)

13、貼圖動畫紋理的矩形頂點緩沖區(qū)m_MeshVB,同時創(chuàng)建了25副實現(xiàn)連續(xù)貼圖動畫的紋理。核心代碼如下:/創(chuàng)建矩形頂點緩沖區(qū)hr= pd3dDevice-CreateVertexBuffer(sizeof(SHINEVERTEX)*4, 0, SHINEVERTEX:FVF, D3DPOOL_MANAGED, &m_MeshVB, NULL);if(FAILED(hr) MessageBox(NULL, LCreate Rect Vertex Buffer Error!, L, MB_OK);return hr;/填充矩形頂點緩沖區(qū)SHINEVERTEX* pVertices;m_MeshVB-L

14、ock(0, 0, (void*)&pVertices, 0);pVertices-vPos = D3DXVECTOR3(-1.0f,-1.0f, 0.0f); /第一個頂點/改變坐標 pVertices-vTex = D3DXVECTOR2(0.0f, 1.0f); /改變紋理pVertices+;pVertices-vPos = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); /第二個頂點pVertices-vTex = D3DXVECTOR2(0.0f, 0.0f);pVertices+;pVertices-vPos = D3DXVECTOR3(1.0f,-1.0f, 0

15、.0f); /第三個頂點pVertices-vTex = D3DXVECTOR2(1.0f, 1.0f);pVertices+;pVertices-vPos = D3DXVECTOR3(1.0f, 1.0f, 0.0f); /第四個頂點pVertices-vTex = D3DXVECTOR2(1.0f, 0.0f);m_MeshVB-Unlock();/創(chuàng)建紋理D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode00.dds, &m_pddsShineTextures0);D3DXCreateTextureFromFile(pd3dDevi

16、ce, Lsimple_explode01.dds, &m_pddsShineTextures1);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode02.dds, &m_pddsShineTextures2);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode03.dds, &m_pddsShineTextures3);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode04.dds, &m_pddsShineTextures4

17、);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode05.dds, &m_pddsShineTextures5);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode06.dds, &m_pddsShineTextures6);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode07.dds, &m_pddsShineTextures7);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_

18、explode08.dds, &m_pddsShineTextures8);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode09.dds, &m_pddsShineTextures9);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode10.dds, &m_pddsShineTextures10);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode11.dds, &m_pddsShineTextures11);D3DXCrea

19、teTextureFromFile(pd3dDevice, Lsimple_explode12.dds, &m_pddsShineTextures12);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode13.dds, &m_pddsShineTextures13);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode14.dds, &m_pddsShineTextures14);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode

20、15.dds, &m_pddsShineTextures15);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode16.dds, &m_pddsShineTextures16);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode17.dds, &m_pddsShineTextures17);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode18.dds, &m_pddsShineTextures18);D3DXCreateTex

21、tureFromFile(pd3dDevice, Lsimple_explode19.dds, &m_pddsShineTextures19);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode20.dds, &m_pddsShineTextures20);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode21.dds, &m_pddsShineTextures21);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode22.dd

22、s, &m_pddsShineTextures22);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode23.dds, &m_pddsShineTextures23);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode24.dds, &m_pddsShineTextures24);其中,SHINEVERTEX是我們預先定義的存放連續(xù)貼圖動畫數(shù)據(jù)的結構體:struct TREEVERTEX D3DXVECTOR3 vPos;D3DXVECTOR2 vTex;static const D

23、WORD D3DFVF_TREEVERTEX = D3DFVF_XYZ | D3DFVF_TEX1;這段代碼的運行結果是,頂點緩沖區(qū)m_MeshVB中存儲了作為連續(xù)動畫載體的矩形的頂點數(shù)據(jù),紋理數(shù)組m_pTreeTex中存儲了用來實現(xiàn)連續(xù)貼圖動畫的25副紋理。第二步,根據(jù)時間間隔,渲染不同的紋理實現(xiàn)爆炸動畫效果。核心代碼如下:static int dwShineTick = 0; /用靜態(tài)變量記錄當前應顯示第幾副紋理static FLOAT fLastTime = 0.0f; /記錄上一副紋理顯示的絕對時間if( fTime - fLastTime 0.1f )fLastTime = fTim

24、e;if( +dwShineTick 24 ) dwShineTick = 0;/設置紋理pd3dDevice-SetTexture( 0, m_pddsShineTexturesdwShineTick );pd3dDevice-SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );pd3dDevice-SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice-SetSamplerState( 0, D3DSAMP_MINFILTER, D3DT

25、EXF_LINEAR );pd3dDevice-SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );pd3dDevice-SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);pd3dDevice-SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);pd3dDevice-SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);/渲染pd3dDevice-SetStreamSource(0, m_Mes

26、hVB, 0, sizeof(SHINEVERTEX);pd3dDevice-SetFVF(SHINEVERTEX:FVF);pd3dDevice-DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);這里我們用靜態(tài)變量dwShineTick記錄當前應該顯示第幾副紋理,同時用靜態(tài)變量fLastTime記錄上一副紋理顯示的絕對時間。函數(shù)OnFrameRender()的接口參數(shù)fTime為我們提供了當前的絕對時間。如果當前絕對時間與上一副紋理顯示時的絕對時間的差值超過了我們指定的時間間隔0.1,則更換紋理。這時,首先判斷當前紋理是不是最后一幅紋理,即判斷dwShineT

27、ick是否大于24,如果不是,則dwShineTick加一,表示將下一副紋理應用到矩形中進行渲染;如果當前紋理是最后一幅紋理時,則將dwShineTick重新設置為0,表示將矩形的紋理設置為第一副紋理從頭開始重新進行渲染。也就是說,程序TextureAnimation.cpp中的紋理動畫是循環(huán)播放的。隨后的工作就是設置紋理渲染狀態(tài)并進行矩形的渲染,這些內容我們都已經非常熟悉,這里就不再贅述了。程序TextureAnimation.cpp的運行結果如圖所示:(完整代碼見附錄二)第四章 結果分析與討論通過此次實驗,我們認識到連續(xù)貼圖動畫技術實際上就是將一系列連續(xù)的圖像逐次“貼”到一個矩形對象上,也

28、就是將這些連續(xù)的圖像在矩形上播放出來。在具體應用時,還可以結合廣告板技術一同使用,使矩形對象總是面對觀察者。采用連續(xù)貼圖動畫技術實現(xiàn)動畫效果,可以節(jié)省對系統(tǒng)資源的開銷,運行速度比較快。對于像爆炸這樣的瞬間動畫,采用連續(xù)貼圖動畫技術就比較合適,關鍵是紋理貼圖要制作的逼真。但是根據(jù)對實驗的多次改進與進行,我們發(fā)現(xiàn)對于那些持續(xù)時間比較長的動畫效果,如燃燒、噴泉、瀑布等,則容易漏出破綻。所以此時連續(xù)貼圖動畫技術不再使用,但可以采用粒子系統(tǒng)實現(xiàn)這些動畫效果。對此我們暫時不做研究。致謝:參考文獻: 1 黃興芳 動畫原理M. 上海人民美術出版社,2004.01第1版2005.07第3次印刷2 沈晴霓,聶青,

29、蘇京霞.現(xiàn)代程序設計C+與數(shù)據(jù)結構面向對象的方法與實現(xiàn)M. 北京:北京理工大學出版社,2002.83 英.克里斯帕特莫爾 動畫設計基礎教程 M. 上海人民美術出版社 2005.06第1版2005.06第1次印刷4 耿肇英 Direct 3D和XNA游戲開發(fā)基礎 清華大學出版社5 葉至軍 Visual C+/DirectX9 3D游戲開發(fā)導引 = = Game programming tutorials 人民郵電出版社6 王德才,楊關勝,孫玉萍 精通DirectX 3D圖形與動畫程序設計 人民郵電出版社附錄一:廣告板技術圖片實例主要的源代碼:./-/ Desc: 渲染場景/-void CALLB

30、ACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ) HRESULT hr; /如果正在利用Direct3D設備設置對話框進行設置, 則不渲染場景 if( g_SettingsDlg.IsActive() ) g_SettingsDlg.OnRender( fElapsedTime ); return; /清除后臺顏色緩沖區(qū)和深度緩沖區(qū) V( pd3dDevice-Clear(0, NULL, D3DCLEAR_TARGET | D3DCLE

31、AR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) ); /渲染場景 if( SUCCEEDED( pd3dDevice-BeginScene() ) ) /渲染地面 pd3dDevice-SetTransform( D3DTS_WORLD, &g_matGround ); pd3dDevice-SetTexture( 0, g_pGroundTex ); pd3dDevice-SetStreamSource( 0, g_pGroundVB, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice-SetFVF( D3DF

32、VF_CUSTOMVERTEX ); pd3dDevice-DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); /渲染樹木 pd3dDevice-SetTransform( D3DTS_WORLD, &g_matTree ); pd3dDevice-SetTexture( 0, g_pTreeTex ); pd3dDevice-SetStreamSource( 0, g_pTreeVB, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice-SetFVF( D3DFVF_CUSTOMVERTEX ); pd3dDevice-DrawPr

33、imitive( D3DPT_TRIANGLESTRIP, 0, 2 ); /渲染文本和對話框 DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, LHUD / Stats ); RenderText(); V( g_HUD.OnRender( fElapsedTime ) ); V( g_SampleUI.OnRender( fElapsedTime ) ); DXUT_EndPerfEvent(); V( pd3dDevice-EndScene() ); /-/ Desc: 渲染文本/-void RenderText() CDXUTTextHelper tx

34、tHelper( g_pFont, g_pTextSprite, 15 ); /顯示當前Direct3D設備狀態(tài)和渲染幀速率 txtHelper.Begin(); txtHelper.SetInsertionPos( 5, 5 ); txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) ); txtHelper.DrawTextLine( DXUTGetFrameStats(true) ); txtHelper.DrawTextLine( DXUTGetDeviceStats() ); /顯示其他簡要信息 txtHe

35、lper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) ); txtHelper.DrawTextLine( LBillBoard技術演示 ); /顯示簡單幫助文本 const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc(); if( g_bShowHelp ) txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer-Height-15*6 ); txtHelper.SetForegroundColor(

36、 D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) ); txtHelper.DrawTextLine( LControls (F1 to hide): ); txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer-Height-15*5 ); txtHelper.DrawTextLine( LQuit: ESC ); else txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer-Height-15*2 ); txtHelper.SetForegroundColor( D3DXCOLOR

37、( 1.0f, 1.0f, 1.0f, 1.0f ) ); txtHelper.DrawTextLine( LPress F1 for help ); txtHelper.End();附錄二:實驗TextureAnimation.cpp的主要源代碼:/-/ Desc: 入口函數(shù)/-INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) /為Debug配置啟用運行時內存檢查功能#if defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_

38、LEAK_CHECK_DF );#endif /設置回調函數(shù) DXUTSetCallbackDeviceCreated( OnCreateDevice ); DXUTSetCallbackDeviceReset( OnResetDevice ); DXUTSetCallbackDeviceLost( OnLostDevice ); DXUTSetCallbackDeviceDestroyed( OnDestroyDevice ); DXUTSetCallbackMsgProc( MsgProc ); DXUTSetCallbackKeyboard( KeyboardProc ); DXUTSe

39、tCallbackFrameRender( OnFrameRender ); DXUTSetCallbackFrameMove( OnFrameMove );/應用程序相關的初始化InitApp();/初始化DXUT, 創(chuàng)建窗口, 創(chuàng)建Direct3D設備對象DXUTInit( true, true, true );DXUTSetCursorSettings( true, true );DXUTCreateWindow( LTextureAnimation );DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAccep

40、table, ModifyDeviceSettings );/進入消息循環(huán)和場景渲染DXUTMainLoop();/在此進行應用程序相關的清除工作return DXUTGetExitCode();/-/ Desc: 應用程序相關初始化/-void InitApp() /初始化對話框 g_SettingsDlg.Init( &g_DialogResourceManager ); g_HUD.Init( &g_DialogResourceManager ); g_SampleUI.Init( &g_DialogResourceManager );/為g_HUD對話框設置消息處理函數(shù),添加控件 g_

41、HUD.SetCallback( OnGUIEvent ); int iY = 10; g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, LToggle full screen, 35, iY, 125, 22 ); g_HUD.AddButton( IDC_TOGGLEREF, LToggle REF (F3), 35, iY += 24, 125, 22 ); g_HUD.AddButton( IDC_CHANGEDEVICE, LChange device (F2), 35, iY += 24, 125, 22, VK_F2 );/-/ Desc: 設備能力檢

42、查/-bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )/檢查后臺緩沖區(qū)格式是否支持Alpha混合等操作(post pixel blending operations) IDirect3D9* pD3D = DXUTGetD3DObject(); if( FAILED( pD3D-CheckDeviceFormat( pCaps-AdapterOrdinal, pCa

43、ps-DeviceType, AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat ) ) ) return false; return true;/-/ Desc: 修改Direct3D渲染設備設置/-bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext ) /如果不支持硬件頂點處理則使用軟件

44、頂點處理 if( (pCaps-DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) = 0) pDeviceSettings-BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; /如果使用參考設備,則彈出警告對話框 static bool s_bFirstTime = true; if( s_bFirstTime ) s_bFirstTime = false; if( pDeviceSettings-DeviceType = D3DDEVTYPE_REF ) DXUTDisplaySwitchingToREF

45、Warning(); return true;/-/ Desc: 在此創(chuàng)建管理內存資源對象/-HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) HRESULT hr; V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) ); V_RETURN( g_SettingsDlg.OnCreateDevice( pd3d

46、Device ) ); /創(chuàng)建字體 V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, LArial, &g_pFont ) );/創(chuàng)建頂點緩沖區(qū) V_RETURN( pd3dDevice-CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED,

47、 &g_pVB, NULL ); CUSTOMVERTEX vertices = -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, , -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, , 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, , 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, ; VOID* pVertices; if( FAILED( g_pVB-Lock( 0, sizeof(vertices), (void*)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) );g_pVB-Unlock();/創(chuàng)建紋理V_RETURN( D

溫馨提示

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

評論

0/150

提交評論