在游戏里我们经常会看到:怪物死亡之后通常不是瞬间消失,而是从模型的某一位置开始消失,最后蔓延至全身,有点类似于燃烧,这种现象叫做消融(Dissolve)。
本篇主要讲解消融特效的实现逻辑。使用Unity的Amplify Shader Editor进行节点连接。而下一篇会将逻辑写成真正的shader代码。
下面先展示一下大概的预览效果:
效果预览
简单逻辑
消融的效果主要利用了shader里的裁切(Clip)功能,在Amplify里叫做Opacity Mask。比如裁切值为0,那么只有当数值大于0,像素才会被渲染出来,否则会被剔除。
一张灰度图的像素值在0~255之间,转换到程序里也就是0~1之间。0是黑色,1是白色。
假如有一张Noise灰度贴图,最开始我加上一个数值v=1,那么所有像素值都是白色。如果我逐渐把v减少,像素的数值也会逐渐减少。当v=0的时候,贴图恢复到原始样貌。我继续减少数值v,当v=-1的时候,贴图所有像素都变为黑色。把这个变化的过程传递给shader做裁切计算,就可以实现模型逐渐消融的效果。
美术资源准备
除了模型本身需要的贴图之外,还需要两张控制消融效果的贴图。
在PS里生成一张云彩的Noise纹理,然后点击图像菜单下的“自动颜色”命令,使图像的像素值完全占用满0~255的范围,这样才不至于有空白的区间产生。
Noise贴图
使用PS的渐变工具制作一张左侧黑,中间红,右侧黄,最右侧白的渐变贴图,作为消融过程中的自发光采样颜色。
渐变贴图
注意:渐变贴图导入unity之后,一定要把Wrap Mode设置为Clamp,否则采样的时候,纹理坐标为0的位置会采样到纯白的颜色。
渐变纹理设置
Shader设置
为了正常开启shader的Opacity Mask通道,对shader做一下设置
渲染类型为:Transparent Cutout
渲染顺序为:Alpha Test
PBR Specular节点
PBR贴图
本次shader是按照unity的Specular工作流设计的,使用了Albedo、Normal、Specular、Smoothness、和AO贴图,其中Smoothness存于Specular贴图的Alpha通道里。然后把它们分别连接到对应的通道。
Opacity Mask节点
创建一个名为Dissolve的变量,范围设置为0~1,0表示没有消融,1表示完全消融。
然后通过Remap节点把数值范围重新映射到-1~1之间,对应我们最开始讲的数值v。
Noise纹理减去这个数值,经过Saturate节点,把范围裁切到0~1,然后连接到Opacity Mask通道。
这个时候就可以通过控制材质面板的Dissolve变量控制模型的消融了。
以下是到目前为止的效果:
为了使效果更加酷炫,我们在消融的位置添加自发光的效果。
把Opacity Mask再次重新映射成-4~4的范围,为了使黑色的范围稍微扩大,并且白色部分数值变大。
然后使用Saturate节点把范围裁切至0~1,反相之后用于对渐变纹理进行采样。从而使消融的边缘自发光从白色逐渐过渡到黄色、红色,而未开始消融的部分自发光依然是黑色。
再乘以一个变量Emissive,用于控制自发光强度,最后连接到Emission通道上。
最终
材质面板所有开放的变量
材质面板
添加了Unity的后期处理Bloom效果之后,自发光有了光晕的效果。
又添加了一个C#脚本,鼠标指上去之后开始消融,离开之后恢复原始效果。
最终运行之后的效果如下: