我们对Oats Studios开发的《ADAM》项目,已经揭秘了 Timeline的运用、服装设计与布料模拟、Alembic导入。今天将分享来自Made with Unity团队中的高级技术美术Jean-Philippe Leroux的文章《ADAM中的光照的使用技巧和经验》。Jean-Philippe在ADAM项目中负责为Oats Studios的灯光师提供支持,帮助他们实现令人惊叹的实时效果。
在ADAM中基础设置-光照基础
Unity支持非常多的平台,这同时也意味着会有许多的光照工作流程可供选择。对于ADAM这样的高保真电影级项目,Oats团队要做哪些基本选择已很明显。
开始Oats团队将Color Space(色彩空间)设置为Linear。这是我们在设置一个新项目时首先要做的事情,因为它对于光照计算至关重要。唯一不使用这个色彩空间的理由是:如果你的目标平台是低端设备,无法支持此功能。
然后将Rendering Path(渲染路径)设置为Deferred。这不仅可以允许使用一些诸如屏幕空间反射这样的酷炫渲染技术,它还通过取消灯光数量限制,大大简化了光照工作流程,因为大部分的灯光拥有巨大的几何体积。
对于Tonemapping(色调映射),Oats团队选择的是Unity的Post-Processing Stack中的ACES。ACES是电视和电影产业作为所有图像源的基础而推出的标准。它提供了一种很重要的自然对比,那是现代电视蓬勃发展的基础之一,而且它还正确保留了白色避免被剪裁。
由于ADAM电影的很大部分是在“人化”角色,因此色调映射是视觉发展(通过光照、着色器等将情感表现到角色上的艺术)中关键步骤。此外色调映射实际上还会决定你将如何照明和曝光你的镜头。
摄像机剔除的发光平面在房间中的布置
添加二帧长度的缓冲区
处理Alembic缓存
“现在Unity已添加了对Alembic的支持,它是个非常的桥梁。我们需要它来缓存巨大的几何数据集。”Oats Studios的特效总监Chris Harvey表示。
我们用于布料与面部模拟的Alembic缓存实际上就是网格。在ADAM中,它们位于世界原点,并据此计算全局光照探头。为了保证所有的东西都能被正确处理,Oats将“Anchor Override”渲染器探头设置到了角色的骨盆上。如此一来,探头将会基于角色在布景中的位置进行正确计算,而不是根据缓存的轴心点。
设置Anchor Override
使用Dynamic Decals资源包
在《ADAM 3》中,注意观察那些很酷的涂鸦,鹅卵石,灰尘和细节。Oats团队从Dynamic Decals资源包里拿了不少东西来实现它们。但是在使用实时全局光照时,效果并不是很理想,因为贴图无法被正确照亮,在阴影中显得非常暗。
在延迟渲染中,全局光照被解析之前,这些效果会在处理反射时写入到缓冲区。当我们使用天空盒作为环境光时就会出现问题。如果你使用的是渐变或颜色,你不会遇见这个问题。我们使用解决方案是:使用一个Lambert球以及一个DecalAmbient着色器球,编写它自己的Ambient Override,并对值进行调整直到尽可能匹配。
自定义Decal Ambient Override vs 一个Lambert球
阴影
你可能知道的,阴影对于表现光的质量非常重要。而且说实话,这个领域在过去十年内一直没有显著的功能性大突破。不过,ADAM中的光照质量源于对现有技术的深入理解和掌握。
首先普及一点背景知识:所有的灯光都应该投射阴影,而且应该都是完全不透明的。但许多开发者会使用阴影透明度,以为它会填充阴影区域,但实际上它会破坏光照的连续性,因为光照仍然是有方向的,背面不会受光。
看看下图中Oats团队是如何使用全局光照来填充阴影区域的,减少了对阴影透明度的需求,获得了很好的效果。
自定义Switch Active Asset设置
将每个镜头的光照进行单独组织,免去在对某个镜头进行小调整时影响镜头的风险。如果你打算尝试这种做法,强烈建议你采用一种遵循镜头号码和组序的简洁命名规范。正如我们所发现的,这将大大提升你的效率,并能帮助其他与你一起工作的人。
Timeline中一条被逐个镜头分解后的序列
完美控制精准光源(Punctual Light)
在制作早期,Oats团队表达了对精准光源进行更好控制的需求。具体的说,他们希望控制光源的强度衰减和扩散。Made with Unity的软件工程师John Parsaie为他们创建了一个可以利用剪影(Cookie)栏的资源。这提供了二个可以进行曲线化控制的参数和一个平滑钳制的参数。更酷的事情是,所有灯光仍然能够对全局光照和反射产生影响。
自定义脚本:更好的控制传播距离衰减(Attenuation)和强度衰减(Falloff)
添加闪烁的灯光
为了让ADAM中的火焰和闪光更加动态真实,我们还创建了一个脚本,可进行灯光位置、强度和色调的调节。这个脚本使这些组合的视觉效果更加逼真。将它附加到一个空对象,它会向下传递给所有灯光和特效子对象。
Light Fire Flicker:Oats用于位置设置、强度和色度调节的脚本
效果在场景视图中也可以见,这在进行视觉开发时非常有用。不过,我们在使用中碰到了一点小问题:它一开始会阻止立方体贴图和全局光照烘焙的完成。当发现到脚本是问题的根源后,我们在烘焙时用了另一个命令禁用所有的闪烁脚本。
烟与火
《ADAM 2》开场时,一系列令人印象深刻的熊熊火焰为场景增添了许多戏剧性和紧张感。那些囚犯在穿越黑暗的死寂之地时,是否会屈服于那“炽热”。许多人渴望了解怎样做出如此精彩的效果。据Oats团队的工作人员Stephen Cooney说,他们结合了许多很酷的业内技巧,并且做了很多分层。
燃亮夜空:ADAM 2的开场
我们对大多数的火焰元素使用了动画纹理图集。我们用Houdini生成了一部分,还用到了一些库存的Unity纹理图集。火焰在纹理中被视作“热量”,然后在着色器中重新映射为任意强度,并使用一条功率曲线进行分级。
左)Houdini中制作的循环地面火焰 (右)每帧火焰流动贴图
我们将这与一个平铺的火焰纹理结合,增加一些额外的飞扬尘埃。当最终的“热量”计算出来后,会被重新映射到冷热二种颜色之间。我们使用光学流动贴图来进行帧与帧之间的平滑。这对于只有几帧长度的大烟柱火焰贴图非常有用。
小型火焰组成了非常长(但分辨率更小)的纹理图集,而烟柱部分是一个帧数很低,但分辨率很高的爆炸形状(流动贴图使这变得很容易)。
一个用于表现烟柱(红色表示热量,绿色表示光照)的爆炸纹理以及它的流动贴图
外观的主要部分是我们通过手动调整视觉顺序完成的。而且,由于火焰被视作“热量”,然后被重新映射到实际的值(细节纹理覆盖其上),这使得更容易获得在视觉上有吸引力的亮度。这些用Unity的Post-Processing就可以完成,无需重新考虑纹理。
粒子光照系统,使粒子看起来会发光,这对烟雾效果有用,帮助我们将不同的粒子系统整合到一起。由于光源可以动画化,因此烟雾的亮度也会随之而动,地面也会获得同样的亮度。
我们还这个应用于闪光,以“照亮”烟雾。基本上,它让我们可以将发光粒子系统以某种方式与自定义漫反射系统相连接。
反乌托邦式的营火: 囚犯们听着 Needalus 解释他们的来历
最终感想
与Oats Studios这样一支技艺精湛的团队紧密合作,给我们带来了不少经验。Oats Studios团队中的灯光与图形专家们使用我们现成的游戏引擎创造着栩栩如生的CG短片。在这个项目的过程中,Oats Studios证明了Unity不仅具备制作出色电影质量效果的一切条件,同时还减少了迭代次数和成本开销。我们学到了很多,看到他们不断地扩展特效和叙事的可能性边界,以及所需的一切想象力和辛勤工作。
最后Oats的CG总监Abhishek Joshi表示:在Unity中进行实时照明,对我们来说是个创造性的巨大飞跃。源于离线光线追踪渲染,速度和交互性让我们可以获得在非实时工作流程中从未有过的创意自由与迭代速度。这是动画内容创作的未来。
文章资源
Dynamic Decals
https://www.assetstore.unity3d.com/en/#!/content/76410
Post-Processing Stack
https://www.assetstore.unity3d.com/en/#!/content/83912
SE Screen-Space Shadows
https://www.assetstore.unity3d.com/en/#!/content/77836
GI
https://unity3d.com/cn/learn/tut ... omputed-realtime-gi
小结
ADMA系列揭秘就到此告一段落了,我们希望《ADMA》项目中所积累的技巧与经验能对未来使用Unity创作实时电影和动画的团队产生帮助。更多精彩内容尽在Unity官方论坛(unitychina.cn)! Unity, Adam, 技巧
锐亚教育 锐亚科技 unity unity教程
- 还没有人评论,欢迎说说您的想法!