Notifications
Article
《Sherman》项目背后的技术细节(2)
Updated 4 months ago
720
3
在《Sherman》项目背后的技术细节(1)中,我们介绍了项目背景、设计项目的方法、外观开发和摄像机布局。在第二部分中,我们将介绍角色动画、使用Alembic、使用Visual Effect Graph的方法以及毛发效果实现的细节。

工程下载

《Sherman》提供完整项目工程下载:https://connect.unity.com/p/sherman-unityguan-fang-zhi-zuo-ying-shi-duan-pian

友情提示:
  • 你可以点击[阅读原文],进行工程下载。
  • 在打开工程时,如果出现无法找到Git的错误信息,请先安装Git:https://git-scm.com/downloads
  • 请使用Windows系统打开项目,下面最低配置和推荐配置。

使用Alembic实现高级动画

创作《大白的梦》系列短片时,制作团队把FBX作为主要格式,用来将资源从Maya导入到Unity。
在DCC工具之间传递数据一直是一个难题,从原始格式导出为外部格式会有损原来的内容,使用可用导出格式是有利有弊的。
FBX格式是大多数Unity项目使用的常见格式,它拥有明确定义的优化工作流程。对于大多数Unity项目的动画制作,开发者都会使用FBX文件中基于骨骼的传统动画,但是这种方法有二个限制:
  • 骨骼蒙皮权重限制,存在于Unity 2019.1之前的版本
  • 挤压拉伸的比例补偿
蒙皮权重设置
在Unity 2018.3及更早版本中,Unity最多可以使用4个骨骼对每个顶点添加权重,这让高级蒙皮权重处理起来更加复杂和麻烦。
这个限制在Unity 2019.1中被去除了,现在每个顶点最多支持256个骨骼,但是在制作《Sherman》的时候,Unity 2019.1仍处于早期Alpha测试阶段,所以我们决定继续使用Unity 2018.3制作《Sherman》项目。
挤压拉伸的比例补偿
作为动画师,首先要学习的第一个知识就是挤压拉伸,根据维基百科的话,挤压拉伸被视为动画的12项基本原则中“最重要的”原则。
下图展示了《Sherman》短片在早期动画测试中的挤压拉伸效果,该视频用于测试早期皮毛实现如何作用于角色的动画和绑定。
为了实现真正的挤压拉伸动画,我们使用了“比例补偿”方法。
在制作《大白的梦》项目时,我们使用一些绑定技巧即平整绑定层级实现了这个方法,但对于《Sherman》项目,我们希望使用另一个方法,即Alembic方法

解决方案:Alembic

Alembic是VFX和动画制作中常见文件格式,它作为交换格式而流行起来,允许工作室把内容从不同软件工具移动到工作室的管线中。
与使用蒙皮网格和骨骼来平移和变形网格的FBX不同,Alembic资源是原始模型烘焙后的顶点形式,允许你把原始资源的“所见即所得”副本导入到任何支持Alembic文件的工具中。
Alembic for Unity的第一个实现要追溯到Marza动画星球和Unity Japan团队合作创作《The Gift》短片,那时Alembic被用来在短片结尾形成大型海洋球的波浪动画。我们在和Oats Studios合作制作《ADAM 2》和《ADAM 3》短片时加入了更多相关功能。
Alembic资源包脱离预览阶段
在Unity 2019.1中,Alembic资源包已经脱离预览阶段,这意味着它是一种Unity完全支持的格式。对CG动画行业的从业者来说,这是一个好消息,创作者能够使用自己熟悉的格式并用在自己现有的管线上,这样会有很大好处。
了解Alembic for Unity以及如何使用该资源包,请查看:https://docs.unity3d.com/Packages/com.unity.formats.alembic@1.0/manual/tutorial.html
Alembic的问题
Alembic是一种优秀的格式,原因有很多:它的WYSIWYG(所见即所得)功能可以把内容从一个工具传递到另一个工具,从而使它成为从Maya烘焙动画的理想格式,开发者不必担心FBX等其它格式对特殊绑定或动画约束的限制。
但是,Alembic格式也有一些问题,包括:文件大小、附加对象、材质管理。
文件大小
Alembic文件中每帧动画都是特定帧模型顶点位置的烘焙快照,这会产生大量需要缓存的数据,网格的多边形数越多或动画越长,相应的Alembic文件就会越大。
对于《Sherman》项目,我们在短片上总共有7个序列。对于每个序列,我们都会为场景中每个角色输出相应的Alembic文件,包括:洒水器、水管、矮人雕像等。
最终的Alembic格式动画文件大约有7GB的动画数据,这比相同动画长度的FBX格式文件大很多。由于在实时帧率传输该数据量的开销并不小,因此这部分是需要斟酌改进的。
例如:我们使用过Alembic在《ADAM 2》和《ADAM 3》短片传输角色的元素,包括:服饰和面部动画,我们希望以30fps播放动画,但是实时环境的限制要求我们调整场景中Alembic的细节层级,才可以实现这样的播放帧率。
附加点
我们经常需要附加光照探针或反射探针到场景的动态元素。如果使用骨架动画的话,这个任务会很简单,只要把附加对象作为子对象嵌套到场景层级窗口即可。Cinemachine会使用这些本地引用变换来控制摄像机观察和跟踪的位置。
在把动画导出到Alembic格式时,即导出为“Renderable only”设置,默认不会包含角色的骨架。我们需要找到一种不同方法使Alembic动画在播放时可以附加到正确的位置。
幸运的是,Maya的Alembic导出器提供了一些选项,可以不仅仅导出可渲染网格数据。下图是Maya的Alembic导出选项。
通过取消勾选“Renderable Only”选项,Maya不仅可以导出渲染网格,还可以导出完整的IK绑定和角色的骨架/骨骼位置,这让我们能够使用这些位置来把光照探针、反射探针和VFX附加到合适的节点。
材质管理
Alembic的另一个缺点是:Alembic格式不会在文件中存储任何材质定义。
FBX和一些其它格式都包含哪些纹理应用到哪些材质的定义信息,但对于Alembic格式,这类信息不会从Maya等DCC工具传递到Unity。
这意味着每次动画重新导出为Alembic格式时,我们都需要为特定动画重新映射材质。在制作过程中,使大量Alembic剪辑与合适材质保持同步是很费时间的事情。
我们在《Sherman》项目期间开发了多个工具,以帮助简化Alembic格式文件的材质映射过程。其中二个工具已经添加到新版Film/TV Toolbox资源包,该资源包可以在GitHub获取,或者在Unity的Staging Package库作为资源包获取。
下图为Unity资源包管理器内的Film / TV Toolbox资源包。
USD格式及其未来
皮克斯的开源USD格式在过去几年逐渐受到关注,最近Unity通过资源包发布了USD Unity SDK,提供对USD格式的支持。
在USD格式方面有一些很不错的开发内容,它们展示了USD格式的前景。制作团队对USD格式提供的功能很感兴趣,我们会在未来的制作中持续关注该格式的发展。

线性内容的光照策略

实时环境中的光照和使用传统离线渲染器的光照有很大区别。虽然它们有相同的基础,例如:都要把光线放入到场景,但是各自的技术方法有很大不同。
《Sherman》这类短片中的实时光照通过多种技术实现,包括:光照探针、反射探针、级联阴影贴图和烘焙全局光照。
在处理《Sherman》项目的光照时,我们邀请Unity光照主管Jean-Philippe Leroux为我们提供更专业更优化的光照效果支持。
为了实现实时效果的第一步,对于光照解决方案的特定部分需要进行预计算,为此要做一些前期准备。
全局光照
间接光照需要进行预计算,以实现高质量局部环境光照。所有大型静态对象都标记为对解决方案产生作用,而且这些对象都要制作光照贴图。在这个过程中,我们使用了渐进式光照贴图的Baked Indirect烘焙间接模式。
所有小型对象和动态对象都会被探针组照亮,对于不适合制作光照贴图的较大对象,我们通过使用代理体积使这类对象获得更精细的探针光照。
我们没有烘焙光线,场景里只有天空的影响和定向光的反弹效果。
反射效果
我们还需要使用反射探针,为烘焙局部反射效果设置合适的覆盖。
我们将大部分采集点放到摄像机层级中。由于天空和接近地平线的太阳有很强的定向光,所以需要额外设置,以便正确的覆盖阴影区域。
一些高反射物体会从实时反射中得到更大的受益。在我们的项目中,这类物体主要是金属食盆和有光泽的水管,前者使用球体实时反射探针,后者使用平面反射。
光线
所有光线都是纯动态的,它们的属性可以调整,也可以四处移动,并得到即时反馈。
我们使用的一个工作流程技巧是:使用轴心对象来处理光线位置。轴心会作为目标使用,放置后,它允许我们通过使用“x”键切换本地和全局方向,从而轻松围绕特定对象进行旋转。
请注意:所有光线都会投射阴影。
使用预制件有很多优点:
  • 预制件允许我们不必在场景处理单个对象,让其它对象在场景中可以正常工作。
  • 预制件允许我们快速把改动传递到序列和项目中。
  • 预制件允许我们快速还原重写数值。
对于《Sherman》项目,我们对这些内容创建了主预制件和嵌套预制件:太阳、填充太阳、填充天空、边缘太阳、边缘天空、反射亮光。
主预制件会根据每个画面而构造,我们在Timeline中使用了激活轨道来触发预制件。
在预制件中,我们会找到很多内容,例如:画面特定光线、重写特定全局光照属性的体积、控制大气光照的密度体积、阴影对象。
后期处理等其它属性通过Cinemachine Post Processing剪辑和Timeline来调整,例如:分级、摄像机效果、摄像机剔除等其它优化。
如下图所示,图中是每个画面的Custom Post Profiles,对每个虚拟摄像机应用了CinemachinePostProcessing组件。

毛发和视觉特效

有动画脚本以后,我们很快确定对短片非常重要的关键要素:水的视觉特效和浣熊的毛发。
由于洒水器在短片中扮演“主要”角色,因此早期遇到的挑战之一是弄清如何处理流体模拟效果。处理动画流体模拟的传统方法很多,包括:使用Houdini,或Maya中原生支持的流体系统。
Steven Shmuely使用Maya对流体效果进行了测试,但由于他对Maya流体系统或Houdini不是非常熟悉,我们担心这些工作无法达到想要的结果。
此时,Unity发布了基于节点并使用GPU加速的特效工具Visual Effect Graph。这个工具看起来很强大,但我们没有任何使用经验。随着首席图形测试工程师Vlad Neykov的加入,最终帮助我们实现了惊艳的视觉特效。
使用Visual Effect Graph实现动态效果
在Unity 2018.3中,全新的Visual Effect Graph面向HDRP发布预览版。在《大白的梦》短片中,制作团队使用传统粒子系统和实时物理功能,用于实现破坏效果。
虽然制作团队中没有成员使用过Visual Effect Graph,但我们清楚的知道,为了实现高级水模拟效果和视觉效果,我们需要Visual Effect Graph提供的高级粒子功能和HDRP集成。
我们非常幸运找到了Vlad Neykov,他帮助我们实现短片中华丽的水效果和其它效果。
所有视觉效果都在其对应的Timeline序列上管理,这让Vlad Neykov可以单独在时间和动画上进行迭代,使用Visual Effect Graph提供的自定义Visual Effect Activation Track和传统动画轨道,从而改变视图的属性。
对于洒水器的效果,Vlad Neykov最初想使用一个水效果来管理所有效果,逐渐把它扩展为包含新的情况。
例如:在第一个画面中,水从摄像机角度出现,所以必须给它添加控制功能。在另一个画面中,水在食盆上反弹,所以要给它添加碰撞效果,但该效果要在其它画面中隐藏起来。
在其它画面中,深度碰撞无法在足够近的距离碰撞,所以要替换为球体碰撞。最后,制作过程中几乎所有画面都有单独的水效果来处理特定情况。
Vlad Neykov最初使用屏幕空间深度测试来处理水的碰撞效果,但在测试多种情况后,他改为使用各种碰撞体积的简单平面/球体碰撞形式。
最初,我们主要考虑如何为洒水器实现动态水效果,Vlad Neykov最后解决了短片的所有特效,包括:树叶从树篱落下的细节效果,脚步的尘土效果,泥土爆发的效果和触电效果。
《Sherman》项目对Visual Effect Graph进行了很好的实际测试,并提供了大量反馈,以便后续改进Visual Effect Graph。

处理实时毛发和羽毛效果

在制作短片的时候,我们有一些想要解决的技术目标,其中最大的目标是,关于使用实时引擎制作动画方面经常提到的话题:毛发效果的实现。
起初,我们对处理毛发渲染犹豫不定。虽然我们对John Parsaie作为图形工程师的能力很有信心,但在实时环境实现“离线渲染质量”的毛发效果是一项重大的挑战。
讨论在任意引擎中实现毛发效果时,有四个关键元素组成了解决方案:几何体、着色、动态效果、制作方法。
对于小鸟Sherman身上的毛发,我们解决了前二个元素几何体生成和着色,并对动态效果做了一些实验,但最终决定不将该方法用于最终的短片。
最后的关键内容是毛发的实际制作,给艺术家提供处理毛发的方法对毛发的最终效果非常重要。制作团队做的第一件事是:评估此前对毛发渲染的已有工作内容。Unity中的首个毛发渲染实现由Marza动画星球为《The Gift》短片而开发。
在Unity的Hack Week活动中,某个团队想继续《The Gift》短片所完成的工作,了解Unity中实时毛发效果的其它可能性。该团队把Marza的毛发效果移植到HDRP,为《Sherman》团队实现毛发解决方案提供了工作的基础。
基于Hack Week项目所提供的基本实现内容,John Parsaie和Steven Shmuely开始处理制作毛发的工作流程。但是本文不会过多深入介绍其中的技术细节,我们只希望介绍团队在该方法上使用的要素。

源毛发网格和SDF

Steven Shmuely对毛发效果做的第一件事是为一部分毛发建模,作为单独的毛发部分,该模型烘焙为SDF有向向量场,用作毛发几何体积本身的原始模型。
通过为毛发提供高分辨率原始模型,毛发的保真度比纯粹基于外壳的方法高很多。例如:法线可以根据每根毛发进行计算,从而得到比目前大部分实时毛皮实现更好的光照效果。
随着我们在该实现方法取得进展,第二种分析式SDF被用于结合毛皮的“外层”,从而把二种效果混合起来。
下图为原始毛发网格,用于生成SDF。
底层部分使用了烘焙式SDF,而外层使用了分析式SDF,因此我们加入选项来根据需要选择使用的SDF。
分析式SDF会提供无限制的分辨率,未来会提供直接在Unity中修改毛发配置文件或属性的功能。烘焙式SDF允许烘焙更复杂的几何体,例如:通过分析方法很难实现的羽毛几何体或毛发风格,提供复制DCC工具中制作内容的可预测结果。

刷毛贴图和高度图

毛发本身的效果很好,但浣熊这类动物没有笔直的毛发垂直于身体部分。此外,毛发在动物的身体上往往没有相同的长度。
为了获得合适的结果,提供制作刷毛贴图的功能非常重要,从而用于修改毛发法线和几何体。Steven Shmuely使用Mari生成刷毛贴图,并生成了高度图来控制浣熊身体不同位置的毛发长度。

影视级动态模糊和超采样

制作团队在《Sherman》项目制作期间开发了大量自定义工具,大多数工具在概念上很简单,但是为团队提供了有效的工作流程,并节省了时间。其中一项关键技术是称为“Filmic Motion Blur”影视级动态模糊的系统。
在开发《大白的梦》期间,我们需要解决的主要技术难题之一是动态模糊。在玩游戏时,目前“实时”状态的动态模糊在高帧率下看起来效果很好,但对于离线渲染器,例如:电视要求的24fps,它会出现瑕疵,这对电视播出效果来说是无法接受的。
为了通过迪士尼的质量标准,John Parsaie开发了Filmic Motion Blur系统。Filmic Motion Blur的核心是一个基于积累效果的渲染器。时间轴序列不是在24fps下渲染,而是在960fps下渲染,中间缓冲区会积累到最后写入硬盘的实际帧数中。
由于该效果只是结合现有渲染缓冲区的结果,所以它不必经过修改就可以处理任何材质或着色器。在《Sherman》项目中,同样的技术也用于将毛发采样结合到最终画面。在未来,我们将研究如何使用这种方法来创建高端影视级景深效果和其它超采样效果。
这种渲染画面的方法并非没有缺点,最大的缺点是:它不能运行在实时FPS中。
实际上,在具有毛发细节和毛发效果的4K画质下,我们开始以“每分钟多少帧”的速度范围来输出最终画面,但考虑到现有CPU和GPU离线渲染器需要数小时渲染最终画面,这种方法的速度依旧快得多。

渲染窗口

Filmic Motion Blur系统大幅提高了最终画面的质量,取得了非常好的结果,但最大的缺点是:为了看到带有所有超采样和结合的最终结果,制作团队必须渲染正在制作的序列或画面。
为了解决该问题,我们开发了Render Window渲染窗口,任何团队成员都可以使用这个自定义编辑窗口来输出最终质量的渲染效果。它让Steven Shmuely可以根据需要调整刷毛贴图和毛发,同时可以快速看到最终结果。
下面为Alpha抖动毛发和最终结合画面的对比图。

Unity Recorder录制器

创作《Sherman》项目的过程和常见Unity项目不同。最终结果是从编辑器输出序列化帧数,并组成最终的动画。为此,我们使用了Unity的Recorder资源包,从编辑器渲染出最终画面。
Filmic Motion Blur功能会关联Recorder的Timeline集成,允许我们结合毛发效果,为最终画面创建超采样动态模糊效果。
下图为Unity Recorder的轨道和剪辑设置。
我们在专用电脑上以4K分辨率渲染出最终画面,团队成员不必使用自己的主要工作站来进行渲染。每天晚上,我们会以当前进度的最终质量来渲染出新的“每日画面”,提供给团队进行查看。

小结

本文是《Sherman》项目创作系列文章的第二部分,希望你喜欢关于创作该项目所使用的制作流程和方法的内容。
更多关于《Sherman》的信息,包括完整项目的获取方式,请访问:https://connect.unity.com/p/sherman-unityguan-fang-zhi-zuo-ying-shi-duan-pian
观看部分Unity官方视频,请关注B站帐户:Unity官方。更多Unity新功能介绍,尽在Unity Connect平台(Connect.unity.com)。
Tags:
Unity China
676
Comments
x
xufeng
3 months ago
<size=40>dsdsdsdsd</size>
1
hua1
Staff
4 months ago
11w
😓😓😓👄👄👄
1
hua1
Staff
4 months ago
11w
😁😁😁😁
0