本次VFX的学习从爆炸效果入手,涉及粒子系统参数调试、Material Maker制作贴图、使用Blender制作Mesh、使用Shader Graph创建简单和复杂的着色器实现以下功能:
- Scroll mask 滚动遮罩
- Erode 侵蚀效果
- Animate vertices 顶点动画
- Distort 扭曲效果
- Parallax Occlusion 视察遮挡效果
最终成果视频:
此外,还可以在以下地方找到美术效果参考
- 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 | Trails的Color 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 Mask在Additive混合模式下的版本,通过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 Map 和 Shape 提取圆圈中的部分。我们仍然希望中间的部分是空的,这次使用Math让辉光减去Tonality。对于辉光的亮度控制,我们可以使用一个函数:Math中的A*B。最后将辉光和先前通过Math A-B得到的基本型相加,即可得到我们需要的贴图。
VFX_Tex_GroundImpact_01_albedo也是在Voronoi细胞图噪声的基础上进行处理,只是这次我们不需要清晰的边界,我们需要模糊的阴影。通过调整X为28, Y为4,拉伸Voronoi细胞图,然后连接一个Circle Map将图映射到圆形上,连接一个高斯模糊,设置Sigma为36.8,最后使用Shape去除不需要的部分得到一个阴影图。我们希望这个应用中间是空的,并且有拉丝的纹理,可以使用Value Noise,通过将X设置为27,Y设置为1可以得到一个垂直的噪声,通过Circle Map将图映射为圆形。我们希望这个纹理中间和外围是空的,也就是一个甜甜圈的形状,可以使用Radial Gradient调整黑白梯度以及渐变曲线得到一张中间和外围是黑的,环是白的模糊的甜甜圈灰度图。将两张图通过Blend进行Multiply混合,可以只用Math中的Power对该纹理进行控制,最后将阴影图和纹理图通过Blend进行Multiply混合,得到我们想要的最终阴影图。
VFX_Tex_GroundImpact_02_albedo是在VFX_Tex_GroundCrack_01_albedo的基础上通过调参得到的中间空洞更大、更外扩、亮度更小、形状不一致的版本。
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 Clip,Custom Data中设置模式为Vector,其中x的值就是A通道的值。
- 在Custom1中为x的值设置曲线或者值,即可控制溶解动画
勾选Allow Material Override,即可显示Surface Options
3.2 - Simple Particle Shader
这是一个基本粒子的Shader,主要用在火花粒子和地面裂痕阴影中。比起URP默认的Shader好处是提供了方便的参数调整。
3.3 - Erosion Texture Shader
这是需要溶解动画粒子的Shader,主要用在冲击波和地面裂痕中。其中Alpha Clip连接了一个UV的x值,通过对Custom Data参数的设置,可以用来控制Alpha Clip进而控制溶解的程度。
对于Main Texture的采样UV则是连接了一个Tilling and Offset,用来平铺扭曲原有的贴图,从而得到风格化的波形。
3.4 - Erosion Voronoi Shader
这是用来模拟蘑菇云质感的Shader,首先声明一个变量Voronoi Scale用来控制细胞图Voronoi的数量。同时将Alpha和细胞图Voronoi连接,Alpha Clip和UV1连接用来控制消融动画。同时使用一个Power节点来控制细胞图中的黑色部分,将另一个节点连接到UV1的G节点中,这样就可以使用Custom Data中的y来控制黑色部分的大小。
然后,我们将Power的输出和Color、Vertex Color混合,使得我们可以方便地控制颜色。
随后,声明变量HDR Color类型的Emission和Float Slider类型的Smoothness,Emission用来控制蘑菇云烟雾的底色,Smoothness用来控制反射率,这里设置为0可以使材质变为粗糙不反射的材质。
为了使烟雾扭曲,我们可以使用通过Shader实现顶点动画。在本次的例子中,我们将Position节点连接一个空间为Object特定对象位置的Position。我们希望位置在0~1内随机,因此可以引入一个简单噪声Simple Noise,并将Position和Simple Noise通过Add混合。
为了控制这个噪声对位置的影响,我们可以引入线性插值Lerp,使用一个变量Vertex Amount用来控制影响的变化,范围是0~1。同时,为了进一步强化顶点的摆动,我们使用Tilling and Offset以及声明一个变量Vertex Scale去控制噪声的UV以及噪声的大小。
注意,这种操作在移动平台的性能开销比较大。
3.5 - Smoke Texture Shader
SmokeTextureShader是用来模拟烟雾的Shader,这个Shader由5部分组成,分别是:Main Texture,Mask,Color Setup,Erusion - Custom Stream和Distortion。
- 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 Noise与UV相加,通过Lerp将UV与Add进行线性插值。声明一个Float Slider变量Distortion Amount用来控制插值的程度,和一个变量Distortion Scale用来控制噪声的值。为了实现噪声的UV动画,将噪声的偏移与Time连接实现偏移动画,声明一个Vector变量Distortion Tilling 用来控制平铺的值,以实现不同类型的烟雾。