由于光线的相互作用和变化十分复杂,实时模拟和渲染烟雾与爆炸一直都是行业的难题。
尽管有越来越多的技术支持体积流体模拟和渲染,但大部分的性能开销过大,很难广泛应用到游戏中。所以,和其他渲染问题一样,问题的关键就是用最少的成本做出最为近似的外貌。
2022.2 Tech Stream推出了一个完整的端到端工作流,即从数字内容创作工具(DCC)到Unity,让你能用预计算的模拟逼真地渲染出烟雾。这个工作流可扩展至任意平台,适应任何光照条件。此外,这个解决方案还包括一个随取随用、预先烘焙好的贴图库,让任何人都能实现更为清晰的烟雾效果。
游戏里渲染的烟雾经常使用带纹理的精灵(sprite)完成,因为运算完全体积化的光照对实时项目来说太过昂贵。然而使用精灵经常伴随着一个问题:怎样才能在扁平的2D形状上为烟雾打光?
实际上方法还不少,比如贴上法线或在贴图上烘焙好颜色。但这些方法要么缺乏逼真度,要么缺乏可扩展性,或者两方面都不行。
而六面光照就是解决该问题的另一种方法。它所采用的一套光照贴图储存了烟雾对六个方向射来的光照所做出的反应。这些贴图会被预先合并成两张纹理,并带有一个阿尔法(alpha)通道和一张可选的发光遮罩。
有了这些纹理,烟雾效果便能根据不同的光照条件动态上色。烟雾同时还能展现出体积光的特性,如光线从后方投射时产生的自投影或轮廓光,此类效果用其他技术是无法达到的。
你还可以控制颜色、吸收率、渐变发光,或重贴光照贴图,用相同一套纹理制作多种效果。这样一来,同样的资产就可以被应用到更多的场景中。
这项技术有许多名称,如六面光照(6-way lighting)、六点光照(6-point lighting)、6D光照贴图(6D lightmaps)、六点光照贴图(6-point lightmaps)、烟雾光照(smoke lighting)等等。而且它已在多款3A大作中亮过相过,《骷髅与骸骨》(Skull & Bones)的前VFX技术总监就专门介绍过这项技术。
这项技术的主要优点包括:
该技术的一个缺点在于扁平感。尽管高度清晰的光照可以营造出一种体积感,但该效果仍只是一套纹理,而非3D的体积效果。因此,它最适用于背景或装饰性效果,比如蒸汽或爆炸。要想加入更多深度,你就需要把这个效果应用到更多的粒子上,或结合体积效果使用(比如高清渲染管线的局部体积雾或体积材质)。
这里有几种常见用法:
我们有不少工具来辅助光照贴图的生成。你可以在VFXToolbox库里找到对应的Houdini和Blender导出程序,其他工具还有Image Sequencer(图片序列创建程序),可用于重新打包六面光照贴图的翻页动画,或调整效果的色彩强度。
关于工具安装等说明可在Readme.txt文件中找到。注意,该工具分为两种。一种位于对象环境(Object Context),基于OpenGL渲染节点制作,运行非常快。
第二种处于舞台环境(Stage context),是围绕Karma渲染器制作的。两者都能渲染光照贴图、发光效果和翻页动画的导出文件。
你可以按照标准流程为Blender安装本插件。在偏好(Preferences)菜单安装unity_6way.py文件,再启用插件。之后,你就能在3D视图的Unity类别下找到面板了。
插件支持渲染光照贴图、发光通道,完成基本的构图,或用一段光照贴图序列创建翻页动画。所有任务都可以同时或分开进行,每一阶段都有单独的设定来控制最终成果。
部分DCC工具可能已经有官方或社区自创的六面光照贴图导出工具和插件。
比如,你可以在EmberGen的渲染节点上使用“Six point”选项。请注意,该工作流并未受Unity官方支持,我们并不能控制贴图上的光照强度。不过,你依旧可以手动调整参数。
当然,你也能用自己的工具来创建六面光照贴图。请按照以下步骤和格式打包纹理。
在烘焙时,同一个物体需要在不同的光线下渲染六次。
我们在每次渲染时都会改变白色方向光的方向:相对于摄像机分别为上、下、左、右、前、后。
发光信息,比如火焰,不属于光照贴图,但可以在随后渲染到另一张纹理上,或打包到贴图的另一条通道里。
六面光照贴图的数据被打包在了两张RGBA纹理中,每张贴图的方向则被储存在纹理的颜色通道里(red、green和blue)。
另外,第一张纹理的阿尔法通道包含了透明度,而第二张纹理的阿尔法通道就空了出来。目前,你可以选择将发光性质储存到这条通道内。
你可以在Unity编辑器选择纹理,到预览窗口检查每条通道。
其他工具在生成光照贴图时可能会以不同的顺序打包通道信息。Unity检视器具备通道重新排序的基本功能,但要将一张纹理的通道转移到另一张,图片编辑软件是不可少的。
烟雾的打光是直接整合进HDRP光照循环的,意味着烟雾可以受任何数量的光照影响。而且,光照越多,运算就越繁重(可利用光照图层缓解)。
所有的方向光(Directional)、点光(Point)、聚光(Spot)、长方形光(Rectangular)和线性光(Linear Lights)都会被渲染。管线还能在烟雾内生成高质量的光照效果,产生闪电、电火花、耀斑、萤火虫等等光效。
对于单条光线,我们必须确定光线相对于烟雾粒子的方向,使用这个方向来混合两张光照贴图。对区域光,我们使用了最近似点(Most Representative Point)方法,找出距离最近的光照点来计算出方向。
烟雾粒子还会受间接光照影响,特指光照探针(Light Probes)、自适应探针体积(Adaptive Probe Volumes,APV)、环境光探针(Ambient Probes)和光照探针代理体(Light Probe Proxy Volumes,LPPV)。要实现最高的性能,你可以启用仅环境光模式(ambient only mode)来跳过光照循环,执行成本极低的光照运算。
出于性能的考虑,探针的影响经过顶点着色器估算后才会被插入像素着色器内。如果输出的是四边面,只有四个角会估算探针的作用。对于在空间中不规则的探针,比如APV,部分顶点可能会出现在墙的一边,而其余的在另一边。此时,探针对光线的作用可能出错,并产生图像瑕疵。这里的一个解决方案是使用划分更细的网格,增加顶点数量。此类问题一般不会在户外场景出现。
在我们的模型里,烟雾可以完全散射光线,因此其镜面间接光会被忽视。所以,反射探针并不会影响使用六面烟雾照亮的粒子。
我们还提供了两种烟雾上色方式:一种是在光照贴图修改每条颜色通道的光线吸收率(用来形成更为逼真的烟雾),另一种是简单的相乘(成本最低)。
VFX Graph渲染出的六面光照可借助控制选项来定制效果外观,用同样的贴图制作出不同的效果。
你只要花几分钟即可为项目添加这些美观的六面烟雾。请安装Unity 2022.2及以上版本引擎,并下载VFX Graph和HDRP。
我们已经创建了一个随取随用的贴图库来帮你上手。库中既有可用VFX Toolbox处理和打包的高清资产,也有用于游戏的压缩轻量版。
请按照以下步骤来用贴图和六面光照创建效果:
要想进一步了解VFX Graph,请访问我们的网站,并参阅电子书“The definitive guide to creating advanced visual effects in Unity”。
未来几代的六面光照将围绕着Shader Graph整合与通用渲染管线(URP)支持开发。我们还打算解决技术本身固有的局限(接收阴影时效果会变得扁平,粒子的局部光照贴图不会受到附近物体的遮挡等等)。
我们也正在为VFX Graph添加Volumetric Fog输出,让视觉效果也能生成体积雾。该功能可与六面光照组合生成更优秀的烟雾效果。该功能目前已登陆2023.1.a25版本。
当然,我们仍期待着真正的体积流体模拟、播放和渲染。只要有了这一整套技术,你就能根据自己的目标平台和预算渲染出美观且逼真的烟雾效果。