搜索 Unity

Realistic smoke lighting with six-way lighting in VFX Graph | Hero image
Realistic smoke lighting with six-way lighting in VFX Graph | Hero image
分享

Is this article helpful for you?

Thank you for your feedback!

由于光线的相互作用和变化十分复杂,实时模拟和渲染烟雾与爆炸一直都是行业的难题。

尽管有越来越多的技术支持体积流体模拟和渲染,但大部分的性能开销过大,很难广泛应用到游戏中。所以,和其他渲染问题一样,问题的关键就是用最少的成本做出最为近似的外貌。

2022.2 Tech Stream推出了一个完整的端到端工作流,即从数字内容创作工具(DCC)到Unity,让你能用预计算的模拟逼真地渲染出烟雾。这个工作流可扩展至任意平台,适应任何光照条件。此外,这个解决方案还包括一个随取随用、预先烘焙好的贴图库,让任何人都能实现更为清晰的烟雾效果。

六面光照

不同光照条件下使用六面光照贴图的爆炸效果

游戏里渲染的烟雾经常使用带纹理的精灵(sprite)完成,因为运算完全体积化的光照对实时项目来说太过昂贵。然而使用精灵经常伴随着一个问题:怎样才能在扁平的2D形状上为烟雾打光?

实际上方法还不少,比如贴上法线或在贴图上烘焙好颜色。但这些方法要么缺乏逼真度,要么缺乏可扩展性,或者两方面都不行。

而六面光照就是解决该问题的另一种方法。它所采用的一套光照贴图储存了烟雾对六个方向射来的光照所做出的反应。这些贴图会被预先合并成两张纹理,并带有一个阿尔法(alpha)通道和一张可选的发光遮罩。

 Depiction of six-way lightmaps
六面光照贴图图示

有了这些纹理,烟雾效果便能根据不同的光照条件动态上色。烟雾同时还能展现出体积光的特性,如光线从后方投射时产生的自投影或轮廓光,此类效果用其他技术是无法达到的。

 A single six-way lightmap with different sun orientations
不同太阳光方向下的六面光照贴图

你还可以控制颜色、吸收率、渐变发光,或重贴光照贴图,用相同一套纹理制作多种效果。这样一来,同样的资产就可以被应用到更多的场景中。

这项技术有许多名称,如六面光照(6-way lighting)、六点光照(6-point lighting)、6D光照贴图(6D lightmaps)、六点光照贴图(6-point lightmaps)、烟雾光照(smoke lighting)等等。而且它已在多款3A大作中亮过相过,《骷髅与骸骨》(Skull & Bones)的前VFX技术总监就专门介绍过这项技术

这项技术的主要优点包括:

  • 实时渲染复杂的光线相互作用效果,比如多次弹射的光散射,效果可直接从模拟烤到光照贴图上。
  • 提高图像质量,更好的光照意味着烟雾能更好地融入世界,比如,烟雾在加入场景之后可以适应任意数量和种类的动态光(即方向光、点光、区域光),以及间接(即光照探针)和氛围光。因此,同样的资产可以更好地融入不同的周遭环境。
  • 低成本,高质量。相比于传统的受光精灵,烟雾效果渲染起来要更具性价比。
  • 节省磁盘和纹理内存。翻页书动画纹理会占用大量内存,但六面光照支持重复使用同一批纹理。根据应用的变量(颜色、吸收率等等)和周围的光照条件不同,最终的烟雾效果可产生极大变化。为了节省内存,你可以利用Motion Vector(运动向量)来降低帧数(Tuatara的TFlow就是一款非常实用的工具)。
Six-way lighting used for all smokes and near clouds with many instances of only four VFX graph assets
所有烟雾和近处的云朵都采用了六面光照,但其实只是四个VFX Graph资产的实例

该技术的一个缺点在于扁平感。尽管高度清晰的光照可以营造出一种体积感,但该效果仍只是一套纹理,而非3D的体积效果。因此,它最适用于背景或装饰性效果,比如蒸汽或爆炸。要想加入更多深度,你就需要把这个效果应用到更多的粒子上,或结合体积效果使用(比如高清渲染管线的局部体积雾或体积材质)。

这里有几种常见用法:

  • 白天:模拟太阳和天空的光线穿过烟雾
  • 夜晚:用静态或运动的点光照或聚光来点亮烟雾
  • 高清烟雾
  • 尘埃
  • 蒸汽
  • 体积云:在主云朵上应用六面光照
  • 传送门、沙尘暴或龙卷风等高级效果
用多张六面光照贴图制作的高级传送门效果

创建和处理六面光照贴图

导出程序

我们有不少工具来辅助光照贴图的生成。你可以在VFXToolbox库里找到对应的Houdini和Blender导出程序,其他工具还有Image Sequencer(图片序列创建程序),可用于重新打包六面光照贴图的翻页动画,或调整效果的色彩强度。

HDA for SideFX Houdini

此内容由第三方提供商托管,该第三方提供商不允许在未接受“Targeting Cookies”的情况下观看视频。如果想观看来自这些提供商的视频,请将“Targeting Cookies”的 Cookie 首选项设置为“是”。

Unity VFX Graph到Houdini的六面光照贴图导出器

关于工具安装等说明可在Readme.txt文件中找到。注意,该工具分为两种。一种位于对象环境(Object Context),基于OpenGL渲染节点制作,运行非常快。

第二种处于舞台环境(Stage context),是围绕Karma渲染器制作的。两者都能渲染光照贴图、发光效果和翻页动画的导出文件。

Blender插件

Blender exporter collapsed menu
折叠起来的Blender导出器菜单

你可以按照标准流程为Blender安装本插件。在偏好(Preferences)菜单安装unity_6way.py文件,再启用插件。之后,你就能在3D视图的Unity类别下找到面板了。

插件支持渲染光照贴图、发光通道,完成基本的构图,或用一段光照贴图序列创建翻页动画。所有任务都可以同时或分开进行,每一阶段都有单独的设定来控制最终成果。

Blender exporter stages settings
Blender导出器的各个阶段设置

其他工具

EmberGen sample setup
EmberGen图表设置示例

部分DCC工具可能已经有官方或社区自创的六面光照贴图导出工具和插件。

比如,你可以在EmberGen的渲染节点上使用“Six point”选项。请注意,该工作流并未受Unity官方支持,我们并不能控制贴图上的光照强度。不过,你依旧可以手动调整参数。

当然,你也能用自己的工具来创建六面光照贴图。请按照以下步骤和格式打包纹理。

烘焙光照贴图

在烘焙时,同一个物体需要在不同的光线下渲染六次。

我们在每次渲染时都会改变白色方向光的方向:相对于摄像机分别为上、下、左、右、前、后。

发光信息,比如火焰,不属于光照贴图,但可以在随后渲染到另一张纹理上,或打包到贴图的另一条通道里。

光照贴图纹理的格式

六面光照贴图的数据被打包在了两张RGBA纹理中,每张贴图的方向则被储存在纹理的颜色通道里(red、green和blue)。

另外,第一张纹理的阿尔法通道包含了透明度,而第二张纹理的阿尔法通道就空了出来。目前,你可以选择将发光性质储存到这条通道内。

Lightmap A: Right, Top and Back lightmaps + Transparency
光照贴图A:右侧、顶部和背后的光照贴图+透明度
Lightmap B: Left, Bottom and Front lightmaps + Extra channel
光照贴图B:左侧、底部和前方的光照贴图+一条额外通道

你可以在Unity编辑器选择纹理,到预览窗口检查每条通道。

其他工具在生成光照贴图时可能会以不同的顺序打包通道信息。Unity检视器具备通道重新排序的基本功能,但要将一张纹理的通道转移到另一张,图片编辑软件是不可少的。

烟雾光照渲染

Still of sample explosion at night
夜晚爆炸的定格画面

烟雾的打光是直接整合进HDRP光照循环的,意味着烟雾可以受任何数量的光照影响。而且,光照越多,运算就越繁重(可利用光照图层缓解)。

所有的方向光(Directional)、点光(Point)、聚光(Spot)、长方形光(Rectangular)和线性光(Linear Lights)都会被渲染。管线还能在烟雾内生成高质量的光照效果,产生闪电、电火花、耀斑、萤火虫等等光效。

Dynamic lights inside six-way smoke
六面烟雾内的动态光照

对于单条光线,我们必须确定光线相对于烟雾粒子的方向,使用这个方向来混合两张光照贴图。对区域光,我们使用了最近似点(Most Representative Point)方法,找出距离最近的光照点来计算出方向。

Same smoke effect under different lighting conditions – top left: directional light and ambient; top right: ambient, probe volumes and directional light; bottom left: ambient and probes; and, bottom right: spot light and probes
同样的烟雾效果出现在不同的光照条件下——左上:方向光与环境光;右上:环境光、探针体积和方向光;左下:环境光与探针;右下:点光源和探针

烟雾粒子还会受间接光照影响,特指光照探针(Light Probes)、自适应探针体积(Adaptive Probe Volumes,APV)、环境光探针(Ambient Probes)和光照探针代理体(Light Probe Proxy Volumes,LPPV)。要实现最高的性能,你可以启用仅环境光模式(ambient only mode)来跳过光照循环,执行成本极低的光照运算。

Adaptive Probe Volumes and six-way smoke lighting
自适应探针体积与六面烟雾光照

出于性能的考虑,探针的影响经过顶点着色器估算后才会被插入像素着色器内。如果输出的是四边面,只有四个角会估算探针的作用。对于在空间中不规则的探针,比如APV,部分顶点可能会出现在墙的一边,而其余的在另一边。此时,探针对光线的作用可能出错,并产生图像瑕疵。这里的一个解决方案是使用划分更细的网格,增加顶点数量。此类问题一般不会在户外场景出现。

在我们的模型里,烟雾可以完全散射光线,因此其镜面间接光会被忽视。所以,反射探针并不会影响使用六面烟雾照亮的粒子。

我们还提供了两种烟雾上色方式:一种是在光照贴图修改每条颜色通道的光线吸收率(用来形成更为逼真的烟雾),另一种是简单的相乘(成本最低)。

Comparing multiply and absorption modes to apply color to smoke
对比烟雾上色的相乘和吸收率方式
Evaluation of six-way light scattering aka Bidirectional Scattering Distribution Function (BSDF)
六面光散射的估算即双向散射分布函数(BSDF)

VFX Graph渲染出的六面光照可借助控制选项来定制效果外观,用同样的贴图制作出不同的效果。

1. 颜色与吸收率属性

Create smoke, steam, or clouds with the same lightmaps using color and absorption strength controls
通过修改颜色(color)与吸收(absorption)强度,用同一张光照贴图制作不同的烟雾、蒸汽和云朵

2. 重贴光照贴图

Create more or less dense or stylized effects, remapping the lightmaps
控制效果的密度与风格,重贴光照贴图

3. 发光性

Transform smoke into explosions using different emissive gradients
用两种发光渐变色把烟雾转变为爆炸

如何上手

你只要花几分钟即可为项目添加这些美观的六面烟雾。请安装Unity 2022.2及以上版本引擎,并下载VFX Graph和HDRP

我们已经创建了一个随取随用的贴图库来帮你上手。库中既有可用VFX Toolbox处理和打包的高清资产,也有用于游戏的压缩轻量版。

An example of a free six-way sample that is now available
免费六面烟雾贴图示例

请按照以下步骤来用贴图和六面光照创建效果:

  • 将贴图拖放至Unity的Asset文件夹。
  • 新建并打开一份VFX Graph资产
  • 新建并选中Particle Lit Output(受光粒子输出)节点。
  • 检视器的Material Type(材质类型)下拉菜单中选取Six Way Smoke Lit
Inspector view with “Six Way Smoke Lit” selected
选中6 Way Smoke Lit后的检视器
  • 将Output位置的Positive和Negative Axes Lightmap设为刚刚导入的贴图。
  • 用不同的光照条件进行测试。 

要想进一步了解VFX Graph,请访问我们的网站,并参阅电子书“The definitive guide to creating advanced visual effects in Unity”。

未来计划

未来几代的六面光照将围绕着Shader Graph整合与通用渲染管线(URP)支持开发。我们还打算解决技术本身固有的局限(接收阴影时效果会变得扁平,粒子的局部光照贴图不会受到附近物体的遮挡等等)。

我们也正在为VFX Graph添加Volumetric Fog输出,让视觉效果也能生成体积雾。该功能可与六面光照组合生成更优秀的烟雾效果。该功能目前已登陆2023.1.a25版本。

当然,我们仍期待着真正的体积流体模拟、播放和渲染。只要有了这一整套技术,你就能根据自己的目标平台和预算渲染出美观且逼真的烟雾效果。

欢迎访问我们专门的论坛帖留下你的反馈与疑问。如果你想请求新功能,或为待定功能投票,请查看我们公开的渲染路线图

Is this article helpful for you?

Thank you for your feedback!

加入论坛讨论
相关文章