Notifications
Article
《Sherman》幕后:如何用Unity制作影院级的光照效果
Updated 18 days ago
2.0 K
3
在制作了《Baymax Dreams》之后,曾获艾美奖的制作团队又使用了Unity的高清渲染管线(HDRP)制作了一段新的短片《Sherman》。
作者:Jean-Philippe Leroux,2019年11月13日
原文链接:https://blogs.unity3d.com/2019/11/13/sherman-behind-the-screens-how-to-create-cinema-quality-lighting-in-unity/

我叫Jean-Philippe Leroux,是Unity Meidia and Entertainment Innovation Group(媒体与娱乐创新团队)的光照技术主管。两年前,我加入了Unity,并有幸参与了一些杰出项目的制作,比如尼尔·布洛姆坎普(Neill Blomkamp)的《ADAM》第二集与第三集,还有荣获艾美奖的《Baymax Dreams》。
既然你对本文感兴趣,你可能已经了解到电影行业中现在正有一次巨大的转变:实时制片的兴起。
实时动画现在不仅是一个渲染方案,它甚至革新了整个生产流程。实时创作引擎,也称作游戏引擎,最早是用于游戏开发的工具,而随着画面质量的提高、技术的不断成熟,他们现在也能作为创作影院级质量影片的集成式生产工具。
那么实时渲染与离线渲染有什么不同呢?原先花费数小时才能完成的庞大渲染是怎么在几秒内实现即刻反馈和4k画质的?这里并没有什么魔法,而是许多简化、分类、优化和小伎俩结合在一起的结果。
我们制作《Sherman》动画短片的一个目的之一,是展示HDRP制作顶尖实时渲染的能力。在本文中,我将介绍《Sherman》中使用的Unity实时光照方案,给你带来些实用的建议与提示,帮助你构建自己项目的光照方案。不论你是3D动画专家还是传统光照艺术家,本文都能给你提供新的方法、工具,在Unity中创作表现丰富、细腻,实时渲染的内容。

《Sherman》解构

在这一帧中,实际上有很多光照在同时发生。我们来解构一下,看看所有这些元素是如何结合到一起的。在下方镜头例子中,我们可以套出几乎所有有关Unity光照效果的知识,而你也能在自己的项目中活学活用。
我们将光照效果分为四类,然后分开讨论每一部分的制作。

掌握氛围光照

我们首先会确定场景中的氛围光照。在此项目中,氛围光照并不是简单地用一个环境光来模拟光线散射,而是我们利用了Unity的渐进式光照贴图(Progressive Lightmapper)将全局光照烘焙进光照贴图中,制作出一个局部氛围光照。

光照贴图

我们的项目有多个场景,所有静态场景元素则存在了episode_set场景游戏对象下。
场景光照元素存在了Unity的活跃场景episode_set_lighting下,这步非常重要,因为活跃场景会确定所有光照数据的生成位置。你可以在这里了解更多有关多场景工作流的信息。
我们不需要在001_timeline上构建场景光照,而会在制作过程中解包。如果再看仔细点,可以看到一个ToHide部分,其中包含了一个镜头及一个方向光照实例。部分后期处理效果,如Tonemapping(色调映射)和Ambient Occlusion(环境光遮蔽)在光照上非常重要,而我们需要一个镜头才能展现出其效果。在照射场景时,我们使用了一个临时的镜头,而项目完全加载后,所有临时镜头都将被隐藏,只留一个主要镜头。当烘焙完成后,“ToHide”调试镜头和光照会被再次隐藏。
在光照贴图中的任何物体来说,其UV绝对不应有重叠处,每一面都需要有独自的UV。大部分情况下,你可以在导入时让Unity自动生成光照UV(在这里查看更多关于该话题的信息)。而在一些复杂或有机对象上,UV最好是由专业艺术家使用数字内容创作(DCC)软件来制作。要让光照贴图上一些断断续续的边角更平滑,一个简单的方法就是人工贴合缝隙。
我们来看看光照选项卡,探索下用于《Sherman》的光照设置:
首先,我们使用了Mixed Lighting Bake Indirect(间接混合光照烘焙)和Progressive GPU Lightmapper(渐进式GPU光照贴图器)。由于HDRP不支持Realtime Global Illumination(实时全局光照),我们也就没使用它。每次新版本的Unity发布,GPU Lightmapper都有很大的改善,可是在制作《Sherman》时,它仍缺少一些关键功能。
个人来说,我不喜欢用Shadowmask(阴影遮罩)模式,虽然它可以将阴影和大部分光照烘焙进动画的光照贴图中。而间接烘焙中的光照计算非常简单,光照的分辨率也较低,烘焙时间就更短,并且我们还能一镜一镜地矫正光照的方向。而Direct Sample(直接采样)设置与现模式并没什么关系,因为我们并未使用任何直接光照,无视就好。
一开始可以将Indirect Sample(间接采样)的数值设置较低一些,比如250左右,在掌握了布景后再增加其数值。至于Bounces(反弹)设置,一般2次就足够了,不过我建议在内部使用4次反弹。
在设置光照贴图的分辨率时,你可以先设置较小的分辨率,随后逐渐增大。在本场景中,我们最后的分辨率为10,即每平方米含有100个纹素(Texel)。注意光照和物理的计量单位是Unity单位(每1单位等于环境中的1米)。
在场景中,利用好光照贴图各个网格的参数缩放功能非常重要。当部分对象上的三角形过于小,以致不能覆盖多个光照贴图纹素时,可以放大其比例,而对过远的对象来说,则可以缩小比例。你可以激活Baked Lightmap(烘焙光照贴图)视图和Show Lightmap Resolution(展示光照贴图分辨率)选项来轻松预览贴图的分辨率。
并不是所有对象都适合添加光照贴图。你不该为复杂、多面的对象或者对全局光照没有什么影响的小对象(比如玻璃、树叶、小石子或小垃圾)添加光照贴图,不然渲染耗费的性能可能会过高。为此,我们可以禁用Lightmap Static(静态光照贴图)。
而部分较大的静态物体如篱笆,也不适用于光照贴图,但我们仍希望对象能影响到整体光照。这里有一个小窍门,可以让对象对光照造成影响的同时又不用给其贴图:将对象在光照贴图中的缩放值设为0。如此一来,在篱笆的边角处,你可以看到其遮挡住光照而产生的阴影,而对象本身并无光照贴图。

那别的怎么解决?光照探针

在设置好氛围光照和光照贴图后,一组探针将照亮余下的小型及动态对象。在《Sherman》中,我们创建了一组间距为1米的探针组。
在如草地一类的较大对象上,如果能精妙地使用Light Probe Proxy Volumes(光照探针代理体),则对象的表现效果能有较大的提升。在此种方法下,对象的光照来自于一个局部的探针采样,而不是单个探针。
提示:在一个多场景布景中,只有场景最近点加载的光照探针会被计入光照源。

环境光遮蔽

现在我们已经了解到如何生成超棒的局部氛围光照了,那要如何才能避免让光照射到不可能的地方呢?如何让对象的光照显得连贯一直呢?
首先,你需要用习惯的内容创作工具为部分对象,比如狗屋内部或浣熊的嘴,生成环境光遮蔽贴图。
然后,使用Screen Space Ambient Occlusion(SSAO,屏幕空间环境光遮蔽)后期处理效果来将各元素粘合在一起。
我们会在下方的后期处理部分详细介绍此种效果。

规划反射效果

在实时光照中,间接镜面光照(或称反射)是一系列技术结合的产物。这些技术排列如下:
  1. Real-time planar reflections(实时平面反射)
  2. Real-time reflection probes(实时反射探针)
  3. Small baked reflection probes(小型烘焙反射探针)
  4. Larger reflection probes (yes, the smaller volumes have priority over larger ones) ;大型反射探针(小型探针体的优先级比大型探针体要高)
  5. Sky (天空)
反射的分辨率和缓存皆通过HDRenderPipelineAsset来管理。基本上,平面反射就跟镜子一样。此类反射非常适合平坦表面,也能用于较复杂的情况中,比如影片中浣熊和膨胀的水管表面上的反射。
实时反射探针还能被用于在反射面上展示细节和光源的遮蔽。在影片中,我们使用了一个小的实时球型探针来包裹住狗碗,在上面反射出了即将爆炸的水管。
我们需要用烘焙反射光照探针来覆盖布景。在布置过程中,可以利用大小探针的不同优先级,投射体积和高级混合模式的视差矫正来做出效果。一个很不错的方法是将光照捕捉点放在镜头的平均高度上。
如果仔细观察,就能发现部分反射探针专门用于阴影区域。这些探针是用于消除由天空而来的方向性光线造成的多余镜面反射。

使用时间轴来安排动作

时间轴是所有包含动画内容的编排器和中心。在时间轴上,我们可以为大部分对象添加动画,而在添加每镜的光照时,我们使用的是Activation Track(活跃轨道)。我自己在制作时感觉管理一个镜头的对象组要比一镜一镜地为每个光照绑定组件添加动画要来的简单。
一些小技巧:
  • 如果想在时间轴上给某个对象添加动画,一定要将其放置在对应的时间轴场景中。在我们的影片中,时间轴场景为001_timeline scene。当你重新打开项目,进入播放模式时,在其他场景中存储的动画会失效。
  • 禁用Post-playback(播放后)状态,不然在渲染时场景会保留播放后的光照绑定。
  • 当镜头的时机安排和编辑完成,可以将该动画轨道转换为影片轨道,方便重新排列片段。
在这里了解更多关于活跃轨道的信息。

用预制件制作有多酷

预制件非常适合重复使用,制作一群一群的对象。我们可以在预制件上做出改动,而场景中的所有实例也会自动更改。我们还能用预制件选择性地撤销任何改动、或将其改回原样、或为所有实例做出改动,整个操作简单便捷、可瞬间完成。此外,预制件系统包含的框架能让我们无缝地在工作流中做出改动,既可以微调实例,又可以快速做出不同变换、即刻查看结果。
在2018.2版中,Unity首次推出了嵌套预制件,该功能非常适用于光照绑定的快速迭代。在下图示例中,展示的是第一镜的光照探针预制件层级,我们可以看到活跃轨道上每镜的探针结构。而在图中系统只会展示当前镜头中存在的光照对象,其它对象暂时被隐藏了起来。
在场景的光照层级视图中,可以看到:
  • 布景覆写
  • 本镜中构成阴影的对象
  • 用于制造氛围效果的密度体(Density Volumes)
  • 狗碗的实时反射探针
  • 太阳光照、填充与环圈光照等其它预制件
预制件系统还有另一个好处:当对象在场景中实例化后,不必再一直确保源的路径正确,团队的其他成员也能在场景中参与制作。
这里需要注意的一点是某些预制件上的属性不能被派生出来,如若要做出一些改动,需要新建一个自定义的实例。如指数分析、后期处理分析和时间线等可编程对象就属于这类属性。

添加太阳光

每个镜头组中都含有一个太阳的实例,我们可以一镜一镜地调整太阳的朝向。此外我们还用了一张树木图片来创作些有趣的阴影效果。

高质量阴影

我们在HDRP上使用了正向渲染,用其中的百分比近程软阴影(PCSS)模拟出了光线照射在对象上产生的半影。
在实时模拟下,并没有光线追踪的效果,阴影是以一种称为阴影贴图的技术来实现区域的减少的。阴影会耗费一定的性能,且每个光照上都需要一个阴影。HDRP的阴影图集(Shadow Atlas)系统可投射出含有阴影的光照。在影片中,我们使用了最大规模的地图。大地图能极大地提升画质,但其所含的信息也更多,计算时间也更长。
当地图的信息饱和,系统会动态地调整阴影的大小。每个光照上都有独自的阴影分辨率。在我们的布景中,精准光照的分辨率为1024,而方向性光照则为4x2048。注意在一个方形上,点光源的分辨率为6x1024,比较消耗性能。
方向性光照阴影可用级联阴影贴图(Cascade Shadow Maps,CSM)技术来优化。若要实现最佳质量,可以使用HD阴影设置组件来覆写每镜的阴影分布,也可以在Cinematine的虚拟相机镜头设置中调整剪裁平面附近的片段。这样可以将第一个层级向前回撤,这步随着当前镜头的时长增加,会显得越来越重要。

用片段创作

在HDRP中,许多渲染和后期渲染属性都由片段与相应的“配置”驱动。在Unity2019.1中,这两个属性被糅合成了一个片段组件,可根据类别管理。根据当前摄像机的位置,系统会输入相应的配置值。如果摄像机不在任何片段中,则组件会退而使用全局配置。
每个片段都有优先与权重值,配置值并不能用于制作动画,而这两个值可以。我们正是使用这两个属性来制作触电的动画的。

光照图层

在Unity中,我们可以将对象指定到一个光照图层上。我们手动为浣熊的眼睛放上了一种明亮光,让其看起来更鲜活有趣。我还能使用该功能管理任何由填充和环圈精准光照造成的多余高光,还能防止光线干扰水体效果。

控制直接镜面光照

HDRP中还有一个非常有趣的功能,就是调整光照的最大柔和度(Max Smoothness)。该技术也能用于模拟光照源在反射面上的倒影分散。
我们还能将光照设定为受镜面光影响(Affect Specular)或受漫射影响(Affect Diffuse),在场景中测试这些效果。

掌握体积光

在场景中创作景深时,氛围特效将成为你的强力法器。HDRP高质量体积光(可在HDRP设置中配置)是一个极具耐用性的方案,可通过体积光照控制器(Volumetric Lighting Controller)来最大化其效果。
在《Sherman》中,为了实现最佳局部效果,我们使用了密度体一镜一镜地调整了其形状。

编辑器内的颜色分级和镜头特效

颜色分级效果在制片过程中愈发地重要,它能在Unity内直接实现漂亮的画面。自2019.1版后,后期处理效果已经完全整合进了HDRP中。这里,我将以后期处理V2栈为基础(该栈与2019.1中HDRP的后期处理V3栈互不兼容)。虽然代码可能有改变,但概念还是一样的。
后期处理效果可在片段上使用。我们可以在光照场景的主片段上定义颜色渐变(Color Grading)、环境光遮蔽(Ambient Occlusion)、颗粒(Grain)和动态模糊(Filmic Motion Blur)。这些设置可能会被部分时间轴上拥有更高优先级的片段覆盖。
我们还能用一个名为CinemachinePostProcessing的拓展程序,为每个Cinemachine虚拟摄像机加上任何镜头特效,包括泛光、景深和剪影。在部分情况下,还会用到一种曝光后特效覆写功能,因为当时Unity2018.4中并没有预曝光处理功能。

色调映射

由于整个渲染都发生在管线的线性流程上,设定颜色输出非常重要。我们的项目一开始设定使用了ACES(Academy Color Encoding System)输出颜色。ACES色调映射输出的图像具备较高的对比度,有整体色调较深。而要让色调更轻快些,需要调整伽马值。许多使用了相同方案的游戏也会作同样调整。

轨迹球

Unity团队的新轨迹球功能非常棒。对职业人来说,轨迹球是再熟悉不过了,它们使用简单、深受大家喜爱。

波形颜色曲线

虽然场景内一次只能展示一条曲线,但整个场景中包含有许多的波形颜色曲线。我们展示了Hue对Sat波形,Sat对Sat波形和Lum对Sat波形。
我们还给主相机添加了一个后期处理调试组件,用于激活波形监测和颜色直方图。波形监测非常适合用来分析黑色与白色成分的适宜度。

环境光遮蔽

上文中我们已经提到过环境光遮蔽,这里我们近距离查看一些设置选项。影片总体的光照强度被设为了0.75,而在部分镜头中,强度会略作缩减,以减少出现在树的枝叶中的噪声。同时我们还未使用不基于物理的渲染(PBR)选项,如颜色(Color)或直接光照力度(Direct Lighting Strength)。该特效只在匹配的分辨率上有好的效果,我们需要微调数值来适应输出分辨率。

景深

景深(DOF)不仅仅是镜头的副产品,还是在故事中转移焦点的关键。图像变换速度非常快,我们需要小心处理观众的注意力。
Cinimachine中有一个非常好用的焦点自动跟踪功能。其新版本中代码完全被重写,不再依赖于分辨率。在Unity2018版中,不没有什么VFX图形透明渲染队列功能。使得影片中的水体效果上,我们不能添加任何景深。幸而在2019.2中Unity加入了这个功能。

剪影

剪影效果非常强力,但易被滥用。该效果可模仿真实镜头拍摄效果,在帧的边缘处添加上失去光照的效果。在写实主义中,该效果应该是圆形的。

泛光

泛光效果会创造出一种强光洒在摄像机感光元件和不干净镜头上的漂亮效果。你可以在Unity中设置参数,模仿出这种效果。

结论

动画中的光照可谓又复杂又难掌握。在本文中,我们为传统光照艺术家提供了在实时渲染影片中添加光照的所有知识。希望你阅读本文后能受激励尝试文中的各种小技巧。
我是绝对不会再回去做传统的光照了,不会怀念“过去的好日子”的。实时动画革新了整个制作手艺,打开了新世界的大门。更多的冒险和实验空间,意味着更棒的成果。
如果想了解更多《Sherman》的信息,或者下载整个项目工程,可以查看Unity的电影方案页面。与我们联系吧,告诉Unity和创新团队如何帮助你制作项目。

开发过程中遇到问题?打开Unity Connect App或者Unity编辑器内置群聊工具,在“技术交流”群聊组中提问。
Tags:
Unity China
710
Comments
J
JasonOscar
21 days ago
学习了,感谢大佬分享。
0
h
huanxiaodong
22 days ago
学到了好多小技巧。
0
艺术家
感谢分享,学习了
0