版权所有: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凌晨 欢迎讨论: lythm@sunistudio.com |