Unity Shader Graph 2D - 跳动的火焰
Unity Shader Graph 2D - 跳动的火焰
在游戏中,火焰特效是常见的视觉元素。本文将通过Unity Shader Graph介绍一种独特的2D火焰效果制作方法,使用Voronoi噪声和Gradient Noise等技术手段,实现逼真的火焰动画效果。
在游戏中,火焰特效是常见的视觉元素。通常情况下,火焰特效更多地通过粒子系统来实现。本文将通过Shader Graph介绍一种不同的火焰效果制作方法。
基础设置
首先创建一个名为Fire的Shader Graph文件,然后创建一个名为M_Fire的材质球。
基础的贴图显示
参考UV滚动动画的基础资源显示部分的节点,建立最基本的Texture 2D类型的参数命名为MainTex。这里需要用到一个制作好的图片资源用来做遮挡,节点如下。
火焰的制作
遮罩的实现
制作火焰时,我们需要对中心处进行遮罩的实现。首先可以对我们预先准备的图片资源进行一个One Minus的操作,来获取中心部位是遮罩的效果。然后通过一个Power节点用一个名为Radius的变量来控制中心部分遮罩的范围,再用Saturate节点进行一个0-1的Clamp取值。
火焰的实现
火焰的制作需要使用两种噪声节点:Voronoi噪声(细胞状)和Gradient Noise(模拟随机性)。
Voronoi噪声部分
首先使用Voronoi噪声节点对其进行One Minus的操作,获取像细胞球一样的效果,节点如下。
然后需要给这个Voronoi噪声增加一个Y轴向上的移动。需要用到Time时间节点、控制Y轴移动速度的Speed变量、以及控制UV移动的Tilling And Offset节点,组合之后如下。
将Y轴向上的移动输出的UV给到Voronoi节点的UV输入节点,让细胞噪声有向上的移动。
Gradient Noise部分
创建一个Float类型的Scale变量,用来控制Gradient Noise的噪声范围。然后用Voronois的同一个Time时间节点的输出来做一个Y轴向上的动画。创建一个单独的Float类型的GradientNoiseSpeed来控制移动的速度,同样需要用到Vector2节点和Tilling And Offset节点,组合连接如下。
最后将两部分的结果用乘法Multiply节点进行组合,获得一个类似玻璃网格的效果。
底部遮罩
将两部分融合后,需要做一个底部的遮罩来模拟火焰从下到上的渐变效果。既然是由下到上,那么就会用到Y轴的数据。因此需要一个UV节点加上一个Split节点来获取Y轴的数据。然后用一个Power节点来控制Y轴遮罩的基础范围(如果有需要也可以将这个参数开放出来进行可控)。最后用一个乘法节点乘以一个Float型的Mask变量来控制遮罩的强弱,节点如下。
将遮罩的结果输出与之前两个噪声节点的输出进行相乘,获得底部有遮罩的数据。
最终的火焰效果
将之前准备的圆形遮罩范围与Y轴噪声节点的动画节点进行叠加,然后对其结果进行0-1的Clamp操作(Saturate,因为叠加会使结果大于1)。最后关键的一部就是对其进行One Minus的操作,这样中心的黑色部分会变成白色圆球,圆球周边的白色部分就会变黑色,节点如下。
给火焰加上颜色
用一个Lerp节点来给火焰加上颜色,从外焰到内焰。创建两个Color颜色变量,一个为外焰OutsideColor,一个为内焰InsideColor,颜色也可以设为HDR。最后将颜色的输出结果给到Base Color,Alpha则为One Minus黑白部分的输出。
最终的火焰效果预览如下所示,在Unity场景里赋予材质球和对应的贴图,调整参数可以做多个不同颜色的火焰。