本次VFX的学习从爆炸效果入手,涉及粒子系统参数调试、Material Maker制作贴图、使用Blender制作Mesh、使用Shader Graph创建简单和复杂的着色器实现以下功能:

  • Scroll mask 滚动遮罩
  • Erode 侵蚀效果
  • Animate vertices 顶点动画
  • Distort 扭曲效果
  • Parallax Occlusion 视察遮挡效果

最终成果视频:

此外,还可以在以下地方找到美术效果参考

  • Pinterest
  • Art Station
  • Real-Time VFX

1 - Particle System Overview and Configuration

1.1 - Overview

Global Volume 后处理设置:

  • Bloom 光晕效果
  • Vignette 暗角效果
  • Motion Blur 运动模糊
  • Chromatic Aberration 色差像差

VFX Stylized Explosion 爆炸特效组成:

爆炸特效大致可以分为蘑菇云火花冲击波地面裂痕,再通过细分可以由以下几种粒子系统构成:

构成 类型 名称 描述
Arched Projectile 投掷物 带有抛物线的粒子
Explosion 顶、中、底 蘑菇云 三层从地面升起的蘑菇云,底部大顶部小;底部最先消散,顶部最晚消散
Particle Impact 外围、地面 火花 一种是往半圆形四周飞射而出的火花,一种是底部往底部四周飞射的火花
Particle Floating 外围、地面、轨迹 漂浮火花 一种是飘浮在蘑菇云附近的火花,一种是从地面裂缝往上漂浮的火花,一种是从地面炸出的带有轨迹的快速火花
Smoke Ring 三层波、快速波 白色冲击波 由底向上扩散的白色冲击波
Color Ring 底层波:内层波、外层波、外层波阴影;中层波、顶层波 带颜色的冲击波 底部的带颜色的冲击波:外、内部冲击波、外冲击波阴影
Quick Color Shock Wave 底层波、垂直中层波 快速颜色波 底部快速波、垂直中层快速波
Ground Crack 地面裂缝、地面裂缝阴影、地面裂缝反射光、地面裂缝阴影扩散、地面爆炸物反射光 地面裂缝 包括地面裂缝以及周围的光
Smoke 垂直烟雾 烟雾 从地面裂缝中飘出的光

1.2 - Resource

爆炸用到的美术资源如下:

粒子系统 Mesh Texture Shader
Arched Projectile Billboard Particle:Default Main Texture:Impact Mask:VFX_Mask_SmokeGradient_02 SmokeTextureShader
Explosion VFX_Mesh_SmokeSphere_00 None ErosionVoronoiShader
Particle Impact Stretched Billboard Default SimpleParticleShader
Particle Floating Billboard Default SimpleParticleShader
Ground Particle Floating Billboard Default SimpleParticleShader
Particle Trail Billboard Particle:Default Main Texture:Impact Mask:VFX_Mask_SmokeGradient_02 Particle:SimpleParticleShader ; Trail:SmokeTextureShader
Smoke Ring VFX_Mesh_Ring_00 Impact ErosionTextureShader
Quick Smoke Shock Wave VFX_Mesh_Ring_00 Impact ErosionTextureShader
Orange Smoke Ring VFX_Mesh_Ring_00 Impact ErosionTextureShader
Orange Smoke Ring(Dark 、Smaller) VFX_Mesh_Ring_00 Impact ErosionTextureShader
Orange Float Ring(Top、Bottom) VFX_Mesh_Ring_01 Impact ErosionTextureShader
Quick Orange Smoke Ring Vertical VFX_Mesh_Ring_00 Impact ErosionTextureShader
Quick Orange Shock Wave None ImpactRing01_2x2 SimpleParticleShader
Ground Crack None VFX_Tex_GroundCrack_01_albedo ErosionTextureShader
Ground Mask None VFX_Tex_GroundImpact_01_albedo SimpleParticleShader
Ground Mask_Additive None VFX_Tex_GroundImpact_01_albedo SimpleParticleShader
Ground Mask_02 None VFX_Tex_GroundImpact_02_albedo SimpleParticleShader
Ground Mask_Glow None Default SimpleParticleShader
Smoke VFX_Mesh_SmokePlane_00 Main Texture:Impact Mask:VFX_Mask_SmokeGradient_02 SmokeTextureShader

1.3 - Settings

爆炸的几种参数设置如下:

粒子系统 Shape Settings 备注
Arched Projectile Cone Velocity、Size over Lifetime;Collision;Light;Trails 该粒子到爆炸中心的事件为1.2,对所有的粒子Start Delay + 1.2
Explosion Circle Velocity 、Color、Size、Rotation over Lifetime;Custom Data Color over Lifetime用来模拟由白到黑的过程, 使用Custom Data中的UV2和UV1.XYZW用来控制Shader中的Alpha Clip的程度。
Particle Impact Hemisphere、Circle Limit Velocity、Size over Lifetime Limit Velocity over Lifetime用来控制最大速度
Particle Floating Hemisphere、Circle Velocity、Color、Size over Lifetime Velocity over Lifetime添加旋转、上升的设置。Color over Lifetime 设置为一段纯白一段透明用来模拟闪烁的效果。
Ground Particle Floating Hemisphere Velocity、Color、Size over Lifetime 该粒子是从蘑菇云升起接着从地面裂缝中飘出,Start Delay + 1.5 + 1.2
Particle Trail Hemisphere Velocity、Size over Lifetime;Collision;Trails TrailsColor over Lifetime是一个从蓝到透明的过程。Width的曲线递减到0.3
Smoke Ring None Color、Size over Lifetime;Custom Data Color over Lifetime由黑变白,Size over Lifetime的曲线由0.5到1递增
Quick Smoke Shock Wave None Color、Size over Lifetime;Custom Data Color、Size over Lifetime;Custom Data
Orange Smoke Ring None Color、Size over Lifetime;Custom Data
Orange Smoke Ring(Dark 、Smaller) None Color、Size over Lifetime;Custom Data
Orange Float Ring(Top、Bottom) None Color、Size over Lifetime;Custom Data
Quick Orange Smoke Ring Vertical None Color、Size over Lifetime;Custom Data
Quick Orange Shock Wave None Size over Lifetime;Texture Sheet Animation 通过四张连续贴图ImpactRing01_2x2实现动画效果,在Texture Sheet Animation中设置为2*2
Ground Crack None Color over Lifetime;Custom Data 通过贴图的颜色变化实现动画效果
Ground Mask None Color over Lifetime;Custom Data 通过Color Life Time逐渐使贴图变透明
Ground Mask_Additive None Color over Lifetime;Custom Data Ground MaskAdditive混合模式下的版本,通过Color Life Time逐渐使贴图变透明
Ground Mask_02 None Color over Lifetime;Custom Data Ground Mask的扩大、减小明度的版本,通过Color Life Time逐渐使贴图变透明
Ground Mask_Glow None Color over Lifetime;Custom Data 通过Color Life Time逐渐使贴图变透明
Smoke None Custom Data

1.4 - Particle System Properties

Scene窗口的Gizmo中,可以将框关闭,能够更直观地观察粒子系统的效果。

在Particle System中,默认会打开以下选项:Shape、Emission、Render,以下是一些常用的功能描述:

  • Basic:
    • Loop:循环播放粒子系统,一般情况是不勾选此项的
    • Gravity Modifier:控制重力对粒子的影响,本项目设置为3就有一个不错的效果。
  • Emission:发射模块,可以影响每秒内生成的粒子数量,可以将前面两项都设置为0,开启Bursts,可以实现将粒子一次炸出的效果
  • Shape:控制发射口的形状
  • Velocity over Lifetime:用来控制生命周期内的速度变化。可以在Orbital中设置z轴的值,以实现旋转的效果。
  • Limit Velocity over Lifetime:限制粒子的速度最大值
  • Color over Lifetime:生命周期内的颜色变化
  • Size over Lifetime:生命周期内的大小变化
  • Rotation over Lifetime:生命周期内的旋转变化
  • Collision:使VFX与游戏对象发生碰撞,一般会将Dampen和Bounce(抑制和弹射)设置为0.5,1是完全不反射
  • Texture Sheet Animation:
  • Renderer:用来渲染粒子的形状,同时也可以为粒子加上Shader。

2 - Mesh & Texture

2.1 - Mesh

  • VFX_Mesh_SmokeSphere_00
  • VFX_Mesh_Ring_00
  • VFX_Mesh_Ring_01
  • VFX_Mesh_SmokePlane_00

VFX_Mesh_SmokeSphere_00是使用重构定点修改器通过组合多个多面体制作的;

将修改器应用到物体中,这样我们才能展开正常的UV

Ctrl+A应用全部变换,我们才能保证导入Unity是正确的位置变换。

VFX_Mesh_Ring_00是类似碗型的网格,用来模拟一般的冲击波;

VFX_Mesh_Ring_01用来模拟中部环绕蘑菇云的冲击波;

VFX_Mesh_SmokePlane_00是楔形的网格,用来模拟烟雾,可以在材质中将相关Mask贴图由Repeat转为Clamp防止由于Shader中关于Tiling的设置出现贴图窜位。

在Unity导入Mesh的时候,将缩放比例设置为100,这样才能看清楚。

2.2 - Texture

  • Impact_02
  • ImpactRing01_2x2
  • VFX_Mask_SmokeGradient
  • VFX_Mask_SmokeGradient_02
  • VFX_Tex_GroundCrack_01_albedo
  • VFX_Tex_GroundImpact_01_albedo
  • VFX_Tex_GroundImpact_02_albedo

Impact_02是手绘的尖峰波;

ImpactRing01_2x2是四帧的一组冲击波动画

VFX_Mask_SmokeGradient是一张黑白渐变图

VFX_Tex_GroundCrack_01_albedo使用了Material Maker来制作。首先使用Voronoi细胞图生成噪声,通过Tone提取细胞的边缘Outline,再通过Invert反转颜色,得到黑底白线图,在经过Tone得到清晰的边缘线。通过Circle Map将改图映射变换成圆形,然后通过Shape遮盖掉不要的部分。为了去掉中间部分,我们使用了一个FBM Noise噪声和Shape进行Wrap,得到中心向外扩散的噪声。通过Tonality控制亮度,最后连接一个Math A-B使细胞图减去噪声图。同时,我们希望添加辉光效果,再次对细胞图进行采样,这次使用Tone分离出较粗的边,使用Circle MapShape 提取圆圈中的部分。我们仍然希望中间的部分是空的,这次使用Math让辉光减去Tonality。对于辉光的亮度控制,我们可以使用一个函数:Math中的A*B。最后将辉光和先前通过Math A-B得到的基本型相加,即可得到我们需要的贴图。

image-20230627111624981

VFX_Tex_GroundImpact_01_albedo也是在Voronoi细胞图噪声的基础上进行处理,只是这次我们不需要清晰的边界,我们需要模糊的阴影。通过调整X为28, Y为4,拉伸Voronoi细胞图,然后连接一个Circle Map将图映射到圆形上,连接一个高斯模糊,设置Sigma为36.8,最后使用Shape去除不需要的部分得到一个阴影图。我们希望这个应用中间是空的,并且有拉丝的纹理,可以使用Value Noise,通过将X设置为27Y设置为1可以得到一个垂直的噪声,通过Circle Map将图映射为圆形。我们希望这个纹理中间和外围是空的,也就是一个甜甜圈的形状,可以使用Radial Gradient调整黑白梯度以及渐变曲线得到一张中间和外围是黑的,环是白的模糊的甜甜圈灰度图。将两张图通过Blend进行Multiply混合,可以只用Math中的Power对该纹理进行控制,最后将阴影图和纹理图通过Blend进行Multiply混合,得到我们想要的最终阴影图。

image-20230627111854033

VFX_Tex_GroundImpact_02_albedo是在VFX_Tex_GroundCrack_01_albedo的基础上通过调参得到的中间空洞更大、更外扩、亮度更小、形状不一致的版本。

image-20230627112135263

3 - Shader

本次VFX学习使用的Shader如下:

  • Erosion Texture Shader
  • Erosion Voronoi Shader
  • Simple Particle Shader
  • Smoke Texture Shader

3.1 - Tricks

使用Custom Vertex Streams来控制Shader中的参数:

Particle System中的Renderer有方法能够控制Shader中的参数:Custom Vertex Streams,但是需要用到UV节点。

  • Shader中新建一个UV,并设置通道为UV1,在Custom Vertex Streams中添加一个Custom1.xyzw参数,将Shader中的UV分离出来,并将A通道连接Alpha ClipCustom Data中设置模式为Vector,其中x的值就是A通道的值。

image-20230627171302035

  • Custom1中为x的值设置曲线或者值,即可控制溶解动画

image-20230627171406365

勾选Allow Material Override,即可显示Surface Options

3.2 - Simple Particle Shader

这是一个基本粒子的Shader,主要用在火花粒子地面裂痕阴影中。比起URP默认的Shader好处是提供了方便的参数调整。

image-20230627171620341

3.3 - Erosion Texture Shader

这是需要溶解动画粒子的Shader,主要用在冲击波地面裂痕中。其中Alpha Clip连接了一个UVx值,通过对Custom Data参数的设置,可以用来控制Alpha Clip进而控制溶解的程度。

对于Main Texture的采样UV则是连接了一个Tilling and Offset,用来平铺扭曲原有的贴图,从而得到风格化的波形。

image-20230627173039523

3.4 - Erosion Voronoi Shader

这是用来模拟蘑菇云质感的Shader,首先声明一个变量Voronoi Scale用来控制细胞图Voronoi的数量。同时将Alpha和细胞图Voronoi连接,Alpha ClipUV1连接用来控制消融动画。同时使用一个Power节点来控制细胞图中的黑色部分,将另一个节点连接到UV1G节点中,这样就可以使用Custom Data中的y来控制黑色部分的大小。

然后,我们将Power的输出和Color、Vertex Color混合,使得我们可以方便地控制颜色。

随后,声明变量HDR Color类型的EmissionFloat Slider类型的SmoothnessEmission用来控制蘑菇云烟雾的底色,Smoothness用来控制反射率,这里设置为0可以使材质变为粗糙不反射的材质。

为了使烟雾扭曲,我们可以使用通过Shader实现顶点动画。在本次的例子中,我们将Position节点连接一个空间为Object特定对象位置的Position。我们希望位置在0~1内随机,因此可以引入一个简单噪声Simple Noise,并将PositionSimple Noise通过Add混合。

为了控制这个噪声对位置的影响,我们可以引入线性插值Lerp,使用一个变量Vertex Amount用来控制影响的变化,范围是0~1。同时,为了进一步强化顶点的摆动,我们使用Tilling and Offset以及声明一个变量Vertex Scale去控制噪声的UV以及噪声的大小

注意,这种操作在移动平台的性能开销比较大。

image-20230627195704015

3.5 - Smoke Texture Shader

SmokeTextureShader是用来模拟烟雾的Shader,这个Shader由5部分组成,分别是:Main TextureMaskColor SetupErusion - Custom StreamDistortion

  • Main Texture:这个节点是由Tilling and Offset控制贴图的平铺和偏移,输入是Distortion,用来控制Tilling and Offset的UV以制作扭曲动画,输出到Color Setup中。
  • Mask:这个节点是为了导入遮罩贴图,并与Main Texture进行Multiply以去除黑色的部分。遮罩贴图为[2.2](#2.2 - Texture)中的VFX_Mask_SmokeGradient
  • Color Setup:遮罩贴图纹理贴图以及颜色进行混合输出到Base Color中,其中将遮罩贴图纹理贴图混合后的结构分离出A通道Alpha相连。
  • Erusion - Custom Stream:与[3.1](#3.1 - Tricks)同理,不再赘述。
  • Distortion:添加一个简单噪声Simple NoiseUV相加,通过LerpUVAdd进行线性插值。声明一个Float Slider变量Distortion Amount用来控制插值的程度,和一个变量Distortion Scale用来控制噪声的值。为了实现噪声的UV动画,将噪声的偏移与Time连接实现偏移动画,声明一个Vector变量Distortion Tilling 用来控制平铺的值,以实现不同类型的烟雾。

image-20230627201906320

image-20230627201923549