Unity的照明技巧在ADAM电影中的应用
您是否好奇Oats Studios如何为ADAM: The Mirror and ADAM: Episode 3实时创造如此逼真的场景,角色和服装?下面就带大家了解有关照明,Alembic支持,服装模拟,时间轴,着色器,实时渲染等应用的幕后故事。
大家好,我叫Jean-Philippe Leroux,是Made with Unity团队中高级照明技术艺术家。我在照明方面拥有近15年的经验,在Ubisoft Montreal花费了13年的时间致力于Watch_Dogs品牌的照明开发。我在制作ADAM短片时担任的职务是技术顾问,为Oats Studios的照明艺术家提供技术支持,因为他们想实时获得令人印象深刻的效果。
ADAM:The Mirror和ADAM:Episode 3短片是我第一个用Unity制作的项目。 我在2017年7月开始与Oats Studio协商时就已经开始制作了。我与Oats团队(包括Youngbin Eun,Nathaniel Holroyd和Abhishek Joshi(照明艺术家),Jim Spoto(Unity 领队)和Chris (Harvey VFX主管)进行了良好的沟通。我远程通过Perforce参与他们的工作,十月我在他们的工作室工作了一周,那是我见过最酷的“人类洞穴”。
在ADAM中设置舞台:照明基础。Unity支持大多数平台,这也意味着有多种照明工作流程可供选择。对于像ADAM这样的高保真电影项目,Oats的选择显而易见。
首先,Oats将色彩空间设置为线性。这是我在一个新项目中建立的第一件事,因为它对于适当的照明计算来说是非常重要的。如果您的目标平台是不支持它的较低层设备,则不建议使用此颜色空间。
他们将渲染路径设置为“延迟”。这不仅使Oats能够使用一些很酷的渲染技术,如屏幕空间反射,通过让它们使用任意数量的灯光,大大简化了照明工作流程,这对于设置照明来说尤为重要,因为它们中的大部分带有巨大的几何形状。
对于色调映射,Oats从Unity的后处理堆栈中选择了ACES。ACES是电视和电影行业开发的标准,是所有影像源的共同点。它提供了现代电视蓬勃发展的一个重要的自然的对比,它也正确地保留了剪辑的留白。
由于ADAM电影大部分是对人物进行“人性化”,适当的色调映射是外观发展(通过照明,着色器等将情感传达给人物的艺术)中的关键一步。另外,色调映射实际上会定义如何点亮和曝光照片的方式。(好消息,下一个后期处理堆栈版本将允许您创建自己的色调映射曲线。)
ADAM的场景:Episode 3 带有色调映射
毫无疑问,预计算实时地理信息系统是该项目的关键选择。它允许Oats使用适当的光线反弹,因为他们所有的镜头都使用了动态灯光,而太阳位置也是通过镜头进行调整的。太阳和动态灯一起提供了以后的间接照明输入。
(首先是一些背景知识,如果你对实时GI没有那么熟悉,并且正在考虑将其用于你自己的项目,那么我强烈建议你花上几个小时来学习这个优秀的教程:Precomputed实时GI,这是每个艺术家或开发人员必读的内容,因为它可以帮助您制作出高质量的照明效果,并节省您数小时。
回到ADAM,Unity的实时GI解决方案的警告是只支持定向光阴影。计算中不考虑所有其他光源阴影,因此它们可以穿过每个物体和墙壁。由于这个限制,例如,我们必须找到一种方法来遏制“镜像”房间里明亮的灯光所产生的地理标志。
Oats采用了一个非常简单的技巧来实现这一点。他们使用从摄像机视图中剔除的发射位面,这些发射位面为全局照明做出贡献,不会将光线泄漏到室外。
相机在房间里发射的位面配置
在The Mirror的房间里用发射位面来解决动态的全局照明问题
在开发过程中,Oats开始将更新版本的GI推送到Perforce服务器时出现问题:团队中的每个人都失去了GI并收到错误消息。事实证明,默认的Perforce配置会导致意外的问题。虽然LightingData.asset是二进制文件,但默认情况下,它们被Perforce服务器视为文本文件,这些文件在集成到软件时会损坏它们。为了使生产回到正轨,Oats更正了分配给.asset的配置文件类型并重建GI,确保文件作为二进制文件提交,因为它们已经作为文本文件存在于软件中了。
Oats注意到的另一个问题是,每当太阳位置发生变化时,都会看到pop。 Oats设计了他们的照明镜头,与他们正常的电影制作类似。 这意味着修改太阳的位置,一帧一帧的修改,需要全面更新的实时GI解决方案。不幸的是,即使实时GI CPU使用率设置为无限制,当新镜头的第一帧被绘制时,更新还没有准备好,在每次太阳位置变化时都会引起明显的pop。为进行弥补,Oats提出了临时解决方案:在一个更高的时间轴,我们添加了一,两帧的缓冲区没有输出帧记录。 好消息:Unity 2017.2现在可以使用Frame Recorder中的DynamicGI.IsConverged命令自动进行处理。
您可以看到我们在两次切割之间添加了两个帧
“现在,Unity加上了很棒的支持 - 这对我们来说是一个超级关键的桥梁。 我们需要它能够缓存大型的几何数据集。” - 视觉特效总监Chris Harvey,Oats Studios
Oats用于布料和面部模拟的Oats缓存是有效的网状物。 在ADAM中,他们位于世界的起源,评估GI探针。 为了确保一切都得到妥善处理,Oats只需将“anchor override”渲染器探针指向角色的骨盆。通过这样做,根据字符在集合中的位置而不是缓存的支点来正确评估探针。
设置锚点覆盖
在ADAM第三季情节中,您可以看到一些很酷的涂鸦,鹅卵石,污垢和其它细节。为了补充这些,Oats从Dynamic Decals静态安装包中获取了很多有用的东西。然而,当他们在介绍实时GI时,它并没有起到很好的作用,因为贴标没有获得适当的照明,在阴影中显得非常黑暗。
在延迟渲染中,在解析GI之前,这些效果将通过反射通道写入缓冲区。发生这个问题是因为我们使用了Skybox作为环境光源。如果你使用渐变或颜色,不要担心 - 你不会遇到这个问题。Oats的解决方案是为动态贴图编写自己的环境覆盖,并使用Lambert球体和自定义的DecalAmbient着色球来调整值,直到它们尽可能地匹配。
Oats的自定义Decal Ambient与Lambert sphere进行对比
正如您知道的那样,当我们谈论光的质量时,阴影非常重要。而且说实话,这个领域在过去的十年里还没有看到足够的突破。不过,ADAM的照明质量来源于对现有技术的理解和掌握。
首先,一点背景知识:所有的灯光应该投下阴影,而这些应该是完全不透明的,但是许多开发商使用阴影透明度认为它会填满阴影区域,实际上它会打断灯光的连续性,因为照明仍然是方向性的,背面会保持黑暗。下面看一下Oats如何使用GI来填补阴影区域,阴影透明度的需求得到缓解,效果很好。
注意阴影强度0.8和1之间的差异
Oats也真的提高了阴影质量,使用了简单的修改聚光灯阴影过滤。他们通过覆盖内部延期着色来推动PCF过滤为7×7分辨率。如果你想尝试这个技巧,请注意,它只适用于场景:点光阴影不会受到影响。Oats使用的另一个Unity 2017.1功能是每个灯光的自定义阴影分辨率,您可以在Inspector调试选项卡上找到它。该解决方案必须两种功能,8K为上限。
如果您要尝试此操作,请小心使用高分辨率阴影贴图。更高的分辨率不等于更好的质量。位置越高,影子会变得越清晰 - 但这不是你想要达到的效果,因为这基本上意味着与区域灯光提供的高质量相反。永远记住,光线质量等于软阴影和宽镜面。在这里,您可以看到ADAM中不同设置的影子的分辨率和过滤的区别。
阴影分辨率与过滤的对比:默认PCF 3×3(左)和PCF 7×7(右)
正确设置阴影偏差是Oats的关键。他们希望他们的阴影连接,但不会导致凹凸不平。在Unity中,聚光灯阴影偏差与剪辑平面值相互缠绕。为了确保完美的连接,他们需要尽可能靠近主题。角色照明的起点是大约两个单位。请看下面的效果。
适当的阴影偏置设置(0.005,0.1,5)与默认偏置设置(0.05,0.4,0.2)的对比
同样地,定向光源的级联分布设置必须由逐个拍摄创作,这是Oats使用时间轴自定义轨道所做的。此外,他们还利用SE Screen-Space Shadows套件获得了一些惊人的阴影质量增强功能。通过与级联阴影贴图(CSM)配对,他们获得了世界上最好的偏置设置无法实现的完美接触阴影。
ADAM场景,空间内阴影
一旦照明lookdev被批准为一个序列,Oats麦在时间轴上分开,使他们可以轻松地进行逐步调整。他们基本上会重复每个镜头的lookdev灯光设备,通过时间线激活它。
由于使用基本的“切换活动”轨道将过度使用时间线,因此Oats创建了一个自定义的“切换活动静态资源”片段,允许它们在同一轨道上为每个片段激活两组灯光。
Oats的自定义切换活动静态资源设置
每次组织照明,会让Oats做小幅调整,其他镜头没有任何风险。如果你打算使用这个功能,我强烈建议你使用一个简洁的命名方法,跟随你的镜头号和组号。Oats发现这会让你更有效率,并会大大协助别人和你的工作。
时间轴中的照明顺序的逐帧分解
在生产早期,Oats表示需要更好地控制精确光源。具体来说,他们想要更多的控制光线的衰减和传播。Made with Unity软件工程师John Parsaie为他们创造了一个使用Cookie插槽的静态资源库。作为奖励,这给了Oats曲线控制两个参数和平滑钳位的机会。很酷的事情是,所有的灯仍然有助于全局照明和反光。
自定义脚本使Oats更好地控制衰减和下降
为了实现ADAM的火焰和耀斑的动态效果,逼真的外观,Oats创建了一个完整的脚本,提供了明亮的位置,强度和色调调整。这个脚本确实增加了这些组合视觉效果的保真度。 他们把它附在一个空的物体上,传播给所有的光源和FX。
火光闪烁:Oats脚本设置位置,强度和色调调整
效果也在“场景”视图中可见,在开发外观时很棒。我们遇到了一个小故障 - 它最初阻止了立方体贴图和GI的烘焙。一旦我们意识到脚本导致了这个问题,我们只是简单地使用另一个命令来禁止在烘焙时场景中的所有闪烁。
燃烧的夜空:开启镜像
当ADAM:“镜像”开始时,一系列令人印象深刻的油火在现场提供了戏剧性和紧张感。这些囚犯是否会在夜间的一个致命的场景中陷入“炙热”? 许多人想知道Oats如何完成这个令人印象深刻的效果。 根据Oats斯蒂芬·库尼(Stephen Cooney)的说法,他们结合了许多很酷的行业技巧,做了很多分层:
我们使用动画纹理地图集大多数为火元素。我们在Houdini中生成了一些,我们也使用了Unity的纹理图集。火在纹理中被视为“热”,然后在着色器中重新映射到任意强度,并用功率曲线进行分级。
(L)Houdini(R)框架火焰流程图(相对较低的细节效果很好)
我们结合这个平铺细节火纹理添加额外的砂砾。 在计算出最终的“热量”之后,将这两个颜色重新映射(一个用于冷却,一个用于加热)。 我们使用光流图来平滑地混合帧。这对于只有几帧的大面积羽焰形状的地图集是有用的。
较小的火焰包括非常长的(但较小的分辨率)纹理地图集,而羽毛组件的帧数非常低,但是高分辨率爆炸(流程图使得这很容易)。 我们做了大量的羽毛作为小型的地面火元素并与大羽毛组合。
用于羽流的爆炸纹理(用于加热的红色,用于照明的绿色)及其流程图
通过手动管理可视化订单,我们实现了外观的一个主要部分。 此外,由于火被视为“热”,然后重新映射到实际值(在顶部的细节纹理),这使得它更容易获得视觉上吸引人的亮度水平。这些与Unity的后处理系统很好地结合在一起,不需要重新审视纹理。
Oats粒子照明系统,可以使粒子具有点燃的效果(对烟雾有用),帮助我们把各种粒子系统绑在一起。因为灯光可以是进行动画的,烟雾的亮度会随之而来,地面也会有相同的亮度。
我们也使用这个为了“点燃”烟雾耀斑。 基本上,它允许我们的发射粒子系统使用方法来连接到自定义扩散系统。
反乌托邦式的篝火:ADAM囚犯们正在聆听尼古拉斯人的解释
这个项目对我来说是一个非常棒的介绍,因为我和一个在我们现有游戏引擎中创建逼真的CG短片的灯光和图形专家组成了一个成熟的团队。 我认为,在整个项目过程中,Oats证明了Unity能够提供出色的电影质量效果,同时保持迭代和降低成本。
而且我们也学到了很多,看到他们不断推动视觉特效的界限,以及所有想象和努力工作。 下面请Oats的CG主管Abhishek Joshi说一句话:
Unity的实时照明对我们来说是一个巨大的飞跃。离线光线追踪渲染,速度和交互性使我们完成了创意自由和迭代的速度,前所未有的非实时工作流程。这是创造动画的未来。
联系我们:
公司名称:哲想方案(北京)科技有限公司
北京哲想动画官方网站:www.cogito.com.cn
北京哲想动画微信公众平台账号:zhexiangdonghua
北京哲想动画影视
北京哲想动画影视技术交流群:374715513
联系方式:+ 86 (10) 68421378
俞先生:18610247936