版權所有:Lythm
文章出處:東日制作室
轉載請與作者聯系
先給大家看看效果:
在學會光牆效果之前,首先要知道,最基本的(可能也是最經典的)火焰效果算法, 下面,我詳細說一下,很簡單當然,我所講的算法都是指實時運算的.
首先,看得出來,火焰有個共同點,底部是最亮的,頂部是最暗的,當中是一個過渡.怎麼才能在程序中很方便的顯示過渡色調呢?我的建議是建一個調色版,看到抓圖最頂部的那條由暗到亮的線條了嗎?那就是我在這個演示裡所用到的調色版.這樣在實時渲染的時候僅僅將調色版索引減1就可以達到從暗到亮的效果了.
這是我用的調色版生成的方法,你也可以自己做一個你所需要的,比如加上藍色火苗的顏色,灰的顏色...等等.
代碼大致如下:
WORD p[256]; //我用的是16bit色555模式
ZeroMemory(p,sizeof(p));
for(int i=0;i<64;++i)
{
p[i]=(i/2)<<10;
p[i+64]=0x7c00 | ((i/2)<<5&0x3e0);
p[i+128]=0x7c00 | 0x3e0 | ((i/2)&0x1f);
p[i+191]=0xffff;
}
然後定義一個用來運算的緩沖
char f[320][220]; //因為是對調色版索引進行計算,所以用char就夠了(如果你需要256以上顏色,char就不夠
//火焰的底部往往是最亮的所以在最底部加上燃料
for(int x=0;x
{
j=rand()*width/RAND_MAX;
block=rand()/RAND_MAX>0.5?255:0;
f[height-2][j]=block;
}
火星可以是很大一塊,或很小一塊,只要加上一個方陣就行了,這裡從簡,一個像素一個像素分別加
還可以加上一些粒子,這樣就像往火堆裡撒了一把木硝一樣
//從略
接著就開始生成火焰,從上往下渲染,先看源碼:
for(int y=0;y
for(int x=0;x
{
f[y][x]=(f[y+1][x]>0)?f[y+1][x]-1:0;
}
應該能看出點名堂了吧,因為越往上越暗,所以只要簡單的將下邊的像素索引值減1就成了當前像素的值 當然這只是基本的還不夠,火焰不是這麼精確的遞減的,你可以用簡單的模糊效果,比如取相鄰像素平均值渲染完把它話到屏幕上就行了,是不是很簡單:)
大致知道了火焰效果的實現後,做出光牆效果就簡單了,只要按火焰燃燒的方向生成就行了,也就是說從下到上
上面的代碼改成:
for(int y=height-2;y>0;--y)
for(int x=0;x
{
f[y][x]=(f[y+1][x]>0)?f[y+1][x]-1:0;
}
其實我只是為了說明一種方法,你可以用這種方法來制作其他的效果,充分發揮自己的想象力.另外不要以為現在已經進入高彩乃至真彩的時代就小看調色版技術,很多效果用調色版技術可以使編程更簡單,更直觀.
就這麼簡單,說完了.
lythm於2001,5,6凌晨
歡迎討論: [email protected]