在一些写实风格的游戏中,我们经常可以看到由爆炸、燃烧所产生的滚滚浓烟。其中的的烟雾特效好似不是一张贴图,而像是真实的物理烟雾。例如
什么是体积烟雾?先看一下对比图。
左边和右边用到的是同一张贴图。明显可以看到,左边的更真实、具有空间感和立体感,右边就显得比较平。那么这种体积烟是怎么做的呢?通常有几种做法,一个是利用法线图将烟雾的光照信息记录下来,通过计算得到贴图的明暗关系与受光情况。另一种是利用一张遮罩图,人工将贴图的亮面和暗面划分出来(也是大菠萝3的做法)。这里主要讲第二种方法。
首先我们在制作shader前,先明确几个需求:
1、shader需要有两张贴图,一张烟雾纹理(带有alpha通道)、一张mask遮罩(用来划分明暗面)。
2、需要控制烟雾出生的旋转角度来制造随机感,但是遮罩图是不会旋转的(或者旋转角度是个固定值)
3、可以使用粒子系统控制烟雾透明度,从而达到淡入淡出的自然消散效果。
接下来开始分析:
框1部分的作用是:利用单色通道(R)去控制贴图的旋转角度。其中的随机系数,是对单色通道的数值进行一个倍数放大的运算,来提高随机性。有人会问:粒子系统里不是有随机初始角度吗?这个问题我们稍后再说。
框2部分的作用是:通过一个数去控制mask图的旋转角度,这个数是一个确定的值,可以再shader外部去调整,0-1代表一个旋转周期。
最后的顶点色Vertex Color的alpha通道与贴图通道相乘,以便于在粒子系统里控制淡入淡出。
接下来是贴图部分。这里我用到两张贴图,纹理图是
遮罩图是
纹理图你可以使用各种各样的烟雾贴图去尝试,遮罩图的绘制方法也很简单。(涂涂抹抹随便乱画)
最后是粒子部分,发射器基本参数大家都会,这里就不一一详细说了。重点部分是:
1、不能再按照以往常规的做法给start rotation 0-360的随机变化去改变贴图的初始角度了。因为一旦改变,mask图也会跟着旋转,明暗关系就乱了。
2、刚才我们在shader里是利用单色通道去控制纹理图的旋转角度,所以这里我们利用初始颜色,将它设置为从为从黑道白的随机值,即可实现纹理图的随机旋转。
之后就完成啦,附上gif图,一个是多角度的动态,一个是改变光照方向动态。
需要说明的是,因为我们在制作shader的过程中,占用了R通道,所以无法通过粒子系统去改变烟雾的颜色。解决办法也很简单,你可以再shader中加入控制颜色的外部变量,或者直接ps涂涂抹抹乱花一通,至于更加帅气的拓展就要靠各位小伙伴们的聪明才智来自由发挥了~
附上制作好的shader文件,当然还是希望大家理解原理之后举一反三。
链接:https://pan.baidu.com/s/1qYBCGRa 密码: rdph