2D特效之水波 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
2D特效之水波 by: 劉小軍 Water源碼
資料來源:http://www.cpp3d.com/articles/show.asp?aid=26 水波特效在游戲當中也比較多見,波紋實時生成算法很多,這里介紹一種快速算法。之所以說它是一種快速算法,是因為它的計算既沒有用到sin、cos函數也沒有用到sin、cos函數的查表算法,它只是根據波的傳播原理,通過少量的加減、位移運算來完成。如要多了解一些波的知識,趕快去翻書哦,現在去學或複習還來得及。當然快速的代價是內存的消耗,這一點我們曾在文章里也提到過,為了追求更高的效率,往往可採取犧牲部分內存這樣一種手段來達到目的。 附:演示代碼編譯需VC、DXGuide、DX6或以上SDK。
![]() ![]() void CWaterApp::RippleSpread() { // m_buf1 is the previous frame, // and m_buf2 is the frame before that int I; for (I=320; I<64000-320; I ) { // Spread out m_buf2[I] = ( ((m_buf1[I-1] m_buf1[I 1] m_buf1[I-320] m_buf1[I 320])>>1)) - m_buf2[I]; // Energy damping m_buf2[I] -= m_buf2[I]>>5; } // Swap m_buf1 and m_buf2 short *ptmp = m_buf1; m_buf1 = m_buf2; m_buf2 = ptmp; }最后一步就是根據計算出來的波形做渲染了,我們可以隨便選一幅位圖來作為我們的渲當背景(紋理)。由于我們的緩衝區是各點的偏移(偏離水平面的高度),所以我們可以將當前點前后和左右兩個落差作為光折射后的偏移量來計算光的折射。為了讓紋理圖看起來更象水,可將圖的藍色加深。代碼如下: void CWaterApp::RenderRipple() { DDSURFACEDESC2 ddsd, ddsd1; ddsd.dwSize = sizeof (DDSURFACEDESC2); m_pTexture->Lock(&ddsd); ddsd1.dwSize = sizeof(DDSURFACEDESC2); m_pRender->Lock(&ddsd1); DWORD dwPixel; int xoff, yoff; int k = 320; for (int I=1; I<199; I ) { for (int j=0; j<320; j ) { // do refraction xoff = m_buf1[k-1]-m_buf1[k 1]; yoff = m_buf1[k-320]-m_buf1[k 320]; dwPixel = m_pTexture->GetPixel(&ddsd, 160 j xoff, 140 I yoff); // do shading int p = dwPixel & 0x1F; p = xoff; if (p>31) p = 31; if (p<0) p = 0; dwPixel = (dwPixel & 0xFFFFFFE0) | p; m_pRender->PutPixel(&ddsd1, j, I, dwPixel); k ; } } m_pTexture->Unlock(); m_pRender->Unlock(); }在作渲染的同時不停的加入波源,你們會發現無論波源的多少,其運算速度是一樣的快捷,事實上這可從代碼中看出來,算法與波源的多少是無關的。 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
xshado
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2002-07-24 發送簡訊給我 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: 請問 DXGuide.h 這個檔是sdk裡面就有的嘛 為什麼我編譯時它說我沒這個檔... 請問要去哪下載ㄋ....謝謝ㄌ^^試試看!把DirectX SDK中的DXGuide.h copy 至\include下 #include < DXGuide.h > 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/12/13 13:05:20 |
xshado
一般會員 ![]() ![]() 發表:2 回覆:4 積分:1 註冊:2002-07-24 發送簡訊給我 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: > <.....還是找不到DXguide.h 可以麻煩有的人可以寄給我好嗎....^^ 真的很想看執行出來的結果 謝謝了...真的感激不盡..^^ bqfrv@sinamail.com您到這下載DirectX v9.0 SDK http://msdn.microsoft.com/library/default.asp?url=/downloads/list/directx.asp 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
ra
一般會員 ![]() ![]() 發表:0 回覆:1 積分:0 註冊:2002-12-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |