制作光墙效果

  • 来源: 互联网 作者: rocket   2008-03-18/11:54
  • 在学会光墙效果之前,首先要知道,最基本的(可能也是最经典的)火焰效果算法, 下面,我详细说一下,很简单当然,我所讲的算法都是指实时运算的.

    首先,看得出来,火焰有个共同点,底部是最亮的,顶部是最暗的,当中是一个过渡.怎么才能在程序中很方便的显示过渡色调呢?我的建议是建一个调色版,看到抓图最顶部的那条由暗到亮的线条了吗?那就是我在这个演示里所用到的调色版.这样在实时渲染的时候仅仅将调色版索引减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;

    }

    其实我只是为了说明一种方法,你可以用这种方法来制作其他的效果,充分发挥自己的想象力.另外不要以为现在已经进入高彩乃至真彩的时代就小看调色版技术,很多效果用调色版技术可以使编程更简单,更直观.

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多