利用虚幻材质编辑器制作火焰
最近在YouTube中看了些在Unreal材质蓝图中制作火焰的例子,感觉很有趣,学习记录一下。
最终效果
因为美术风格的不同,火焰也有非常多种不同的风格,卡通,炫酷,写实等等,卡通风格中又包括二次元,美漫等风格。这里记一下简单卡通风格与炫酷风格的火焰,效果均在Unreal5.1中实现,
卡通火焰
完整材质图
火焰颜色插值
为了模拟出火焰颜色的层次感, 要使得火焰外层与内层的颜色有差异。这里进行纹理采样后,火焰边缘透明度接近0,火焰中心透明度接近1,正好利用透明度进行插值,在黄色与红色之间进行插值即可。
火焰主体纹理映射
火焰顶端和底端,需要淡化,这样更符合现实中的火焰形态。淡化用渐变来处理。渐变利用纹理坐标y值的0-1映射来控制。
火焰主体的纹理,由两张噪声图混合,噪声图选择时图像块要贴合火焰边缘的形状。并且利用Panner节点设定从下往上的运动。
同时利用Mask纹理来裁剪出最后的火焰轮廓。
两种扰动思路
前面呈现的效果图中没有加入扰动。“扰动”是一种常见的效果,可以将直线变为曲线,就是在原来采样的基础上,增加一些随机效果,使得整体效果更加不规则(在边缘处比较明显可以看见扰动的效果)。比如
实现扰动一般是读噪声图,将噪声图中对应的值叠加到纹理坐标上,再用新的坐标值对纹理进行采样。
炫酷火焰
炫酷火焰比卡通火焰更贴近现实,但是又超出现实……
完整材质图
这个效果参考链接3
火焰主体纹理映射
对火焰纹理进行采样并混合噪声图,依然利用Panner节点添加滚动效果。利用3PointLevels节点对值重新映射。
菲涅尔效应
主要理解Fresnel节点。
所谓菲涅尔效应,是指光照基于观察者角度的不同形成不同强度反射的现象。比如,低头垂直视线看水面,能看见水底(光线折射多),平行水面看远方水面能看见倒映的天空(光线反射多)。
unreal提供的简单Fresnel节点,有三个参数:
- ExponentIn:控制菲涅尔效果的衰减
- BaseReflectFractionIn:指定从正面观察表面时镜面反射的小数,为1时将禁用菲涅尔
- Normal:可在此处输入法线,影响菲涅尔效果的渲染方式
利用Fresnel节点,将效果控制在物体的边缘轮廓上。
添加火舌
这里通过添加“顶点扰动”从而形成“火舌”,本文顶点扰动用PerlinNoise来做。
因为这里希望火舌向上运动,于是依据顶点法线的方向判断是否需要扰动。法线向下的不需要添加扰动。顶点法线向上还是向下,用法线与物体世界坐标系中up向量点乘来判断(材质编辑器中的ObjectOrientation节点即为up向量)。
Unreal其他实现火焰的方案
- 利用材质编辑器中FlipBook节点对动画纹理进行随时偏移采样形成动画。
- 粒子系统也是常见的制作火焰的方式,尤其是对火焰移动的方向、速度、形态有较高要求时。
关于unreal材质的消耗
Unreal中材质节点到shader代码分为两个过程,材质编辑器中的节点图编译成HLSL代码,然后再把HLSL生成多平台的shader代码,每一个材质节点其实都是一片类HLSL代码的封装。一个材质会编译生成大量的shader源码来匹配不同光照不同材质特性的需求。游戏引擎为了设计师能便捷的进行设计,对于效率做出了些牺牲,虚幻材质系统一方面由于其可达丰富的材质类型而著名,又因为其缓慢的编译过程与冗杂的shader体量而诟病。因此为了游戏能具有更加流畅的表现,在使用虚幻材质时一定要注定材质优化。参考中给了一些材质优化的方法链接,之后我再渐渐总结一些材质优化方法。