利用虚幻材质编辑器制作火焰

最近在YouTube中看了些在Unreal材质蓝图中制作火焰的例子,感觉很有趣,学习记录一下。

最终效果

因为美术风格的不同,火焰也有非常多种不同的风格,卡通,炫酷,写实等等,卡通风格中又包括二次元,美漫等风格。这里记一下简单卡通风格与炫酷风格的火焰,效果均在Unreal5.1中实现,

CartoonFire
FireBall

卡通火焰

完整材质图

full material graph

火焰颜色插值

full material graph
为了模拟出火焰颜色的层次感, 要使得火焰外层与内层的颜色有差异。这里进行纹理采样后,火焰边缘透明度接近0,火焰中心透明度接近1,正好利用透明度进行插值,在黄色与红色之间进行插值即可。

火焰主体纹理映射

full material graph
火焰顶端和底端,需要淡化,这样更符合现实中的火焰形态。淡化用渐变来处理。渐变利用纹理坐标y值的0-1映射来控制。

火焰主体的纹理,由两张噪声图混合,噪声图选择时图像块要贴合火焰边缘的形状。并且利用Panner节点设定从下往上的运动。

同时利用Mask纹理来裁剪出最后的火焰轮廓。

两种扰动思路

前面呈现的效果图中没有加入扰动。“扰动”是一种常见的效果,可以将直线变为曲线,就是在原来采样的基础上,增加一些随机效果,使得整体效果更加不规则(在边缘处比较明显可以看见扰动的效果)。比如

实现扰动一般是读噪声图,将噪声图中对应的值叠加到纹理坐标上,再用新的坐标值对纹理进行采样。

炫酷火焰

炫酷火焰比卡通火焰更贴近现实,但是又超出现实……

完整材质图

这个效果参考链接3

  1. UE4 - Ring of fire on a sphere effect - Test (Material bp shown)

火焰主体纹理映射

对火焰纹理进行采样并混合噪声图,依然利用Panner节点添加滚动效果。利用3PointLevels节点对值重新映射。

菲涅尔效应

主要理解Fresnel节点。

所谓菲涅尔效应,是指光照基于观察者角度的不同形成不同强度反射的现象。比如,低头垂直视线看水面,能看见水底(光线折射多),平行水面看远方水面能看见倒映的天空(光线反射多)。

unreal提供的简单Fresnel节点,有三个参数:

  • ExponentIn:控制菲涅尔效果的衰减
  • BaseReflectFractionIn:指定从正面观察表面时镜面反射的小数,为1时将禁用菲涅尔
  • Normal:可在此处输入法线,影响菲涅尔效果的渲染方式

利用Fresnel节点,将效果控制在物体的边缘轮廓上。

添加火舌

这里通过添加“顶点扰动”从而形成“火舌”,本文顶点扰动用PerlinNoise来做。

因为这里希望火舌向上运动,于是依据顶点法线的方向判断是否需要扰动。法线向下的不需要添加扰动。顶点法线向上还是向下,用法线与物体世界坐标系中up向量点乘来判断(材质编辑器中的ObjectOrientation节点即为up向量)。

Unreal其他实现火焰的方案

  1. 利用材质编辑器中FlipBook节点对动画纹理进行随时偏移采样形成动画。
  2. 粒子系统也是常见的制作火焰的方式,尤其是对火焰移动的方向、速度、形态有较高要求时。

关于unreal材质的消耗

Unreal中材质节点到shader代码分为两个过程,材质编辑器中的节点图编译成HLSL代码,然后再把HLSL生成多平台的shader代码,每一个材质节点其实都是一片类HLSL代码的封装。一个材质会编译生成大量的shader源码来匹配不同光照不同材质特性的需求。游戏引擎为了设计师能便捷的进行设计,对于效率做出了些牺牲,虚幻材质系统一方面由于其可达丰富的材质类型而著名,又因为其缓慢的编译过程与冗杂的shader体量而诟病。因此为了游戏能具有更加流畅的表现,在使用虚幻材质时一定要注定材质优化。参考中给了一些材质优化的方法链接,之后我再渐渐总结一些材质优化方法。

参考

  1. Unreal Tournament Fire Material: Set (virtual) things ON FIRE!
  2. how video games make FIRE
  3. UE4 - Ring of fire on a sphere effect - Test (Material bp shown)
  4. [UE4]性能优化指南(程序向)
  5. UE4材质编译加速
  6. UE4 Shader 编译以及变种实现