基于实时渲染的高真实度Groom毛发实时

中科治疗白癜风有疗效 http://www.jk100f.com/baidianfengzixun/jiankangbaiwen/44509.html

虚幻引擎中的毛发实时渲染

虚幻引擎主要执行优化、渲染、模拟以及毛发LOD的生成,以及有限的造型控制。在理想情况下,你需要先确定好Groom的造型,再将其导入到虚幻引擎中。在初次导入之后更改造型的情况并不罕见,此时只需要在数字内容创作应用中更改造型,随后重新导入Groom即可。

虚幻引擎使用Alembic文件格式作为毛发导入语言,并会通过命名规则来辅助导入XGen、Ornatrix、Yeti和HoudiniHairUtils等数字内容创作工具的静态Groom。

在DCC应用中创建Groom文件并导出为Alembic格式时需要注意,你要确保将特定属性导出到Alembic文件中,详情请参见本白皮书的“导入流程”章节。Ornatrix和Yeti可以将这些属性导出到Alembic文件中,以便后续导入虚幻引擎。

优化

就基于发丝的毛发系统而言,高密度的Groom可以包含数十万甚至百万根发丝,每根发丝也会包含数十个控制顶点。这两点共同构成了导入、渲染和模拟的性能影响因素。

在影片特效等离线渲染流程中,通常会参照真实世界中的(毛发)密度和宽度来尽可能营造真实感。但在实时渲染中,虽然你也可以一开始参照就现实中的密度和宽度,以求尽可能还原参考资料中的效果,但通常最后都需要对性能进行评估并进行优化。

用于实时渲染的毛发,可以在导入虚幻引擎之前,就在DCC应用中完成优化。优化时可以先从控制顶点的数量入手。如果毛发短而直,就可以大幅减少控制顶点,并且不会产生太多的视觉差异。如果毛发长而蓬乱,而且比较复杂,就要避免减少过多的控制顶点,以免有损整体的结构。

下一步就是优化密度和宽度。首先将密度减半,将宽度调整为两倍,并根据需要重新评估。在选取人类毛发的平均宽度时,通常可以先从0.厘米开始,而发际线处、鬓角处和散落的纤细发丝通常会使用更低的宽度值。

视觉感知的密度和实际的密度之间存在一种平衡。较粗的发丝可以阻隔光线和直接可见的皮肤,从而实现更浓密的Groom外观。通常来说,在降低密度的同时,最好通过提高宽度作为补偿,直到在性能与真实性之间取得平衡。如果资产距离摄像机非常近,这种方法未必能够奏效,因为宽度将看起来不够真实。LOD可以在摄像机远离时通过发丝剔除和加厚解决这一问题,在改善性能的同时,确保Groom的宽度与密度能尽可能地贴近现实。如需进一步优化,你可以回归传统,选择基于发片的方法,使用少量大型平整的板片提供大量单独毛发的大致形状和运动。虚幻引擎也为这些方法提供了可用的功能。

导入流程

要将Groom文件导入到虚幻引擎中,你必须先将它从DCC应用中导出为Alembic格式,随后才能将其导入虚幻引擎,并成为Groom资产。

虚幻引擎并不会根据引导曲线和插值规则重建Groom,而是将引导曲线和发丝一同导入,精准地还原制作的Groom。

在导入流程中,导入者需要查找属性和分组并将它们导入进新的Groom资产中,并且这些属性和分组需要遵循“AlembicforGrooms规范”一文中所述的命名规范。实施该方案能将宽度和颜色属性以及模拟与插值毛发所需的导线属性导入到虚幻引擎里。单个Alembic文件中的多个毛发分组可通过group_id支持。在这些属性中,根UV属性会获取底层表面(如皮肤表面)的UV,能够根据底层表面,在Groom中产生部分空间变化。

如果Alembic文件只包含了曲线,但没有遵照Alembic导出规范,Groom文件依然可以导入到虚幻引擎中,但将不包含自定义属性。

要了解关于导入流程的详情,请参考虚幻引擎文档中的毛发渲染主题。

Groom资产编辑器

Groom资产编辑器可以在选中Groom资产时使用,编辑器中的控制选项能够在虚幻引擎中对Groom的上色、优化和其他方面予以协助。

图10:虚幻引擎中的Groom资产编辑器

虽然Groom系统的主要设计目的是处理由发丝构成的Groom,但是出于可伸缩性,也支持发片和网格体的几何形式。为了方便设置,所有几何体表现种类都可以在单个资产(Groom资产)和组件(Groom组件)来管理所有这些几何体表示。编辑器还提供了一个LOD面板,允许你配置每个LOD应该使用的几何体呈现和删减发丝的方式。Groom资产可以由多个分组构成(例如一个刘海分组、一个马尾分组等),每个分组都可以有自己的LOD设置。

要了解关于使用该功能的更多信息,请参考虚幻引擎文档中的Groom资产编辑器用户指南和毛发属性参考。

表面附着

Groom通常会附着在绑定好的骨骼网格体组件上。

要将Groom附着在蒙皮表面上,就需要在层级中将Groom组件附着到骨骼网格体组件下,还需要提供一个绑定资产(请参考虚幻引擎文档中的毛发属性参考)。绑定资产存储了毛发发丝在目标骨骼网格体上投射的信息。

在附着过程中,我们会为每个发根以及与之最近的网格体三角形计算出重心坐标。当网格体在动画期间发生形变时,毛发根部会始终被约束到骨骼网格体上。

图11:发丝如何在皮肤形变期间“扎根”在网格体三角形上的图解

图12:狐獴角色的毛发、导线和绑定

皮肤形变

当皮肤表面形变时,附着在表面上的发丝可能会缩紧,或是移动到不自然的位置上。睫毛、眉毛或胡须等精细的Groom有时可能难以渲染出真实感,因为它们都是由纤细的发丝在不平坦的皱缩皮肤表面上构成的。

为了解决这些问题,Groom可以选用全局形变约束。即使皮肤严重形变,这一约束也能迫使毛发尽可能地保留原状。一组径向基函数(RBF)会在附着的骨骼网格体的多个点位进行预运算,然后在运行时应用,以维持原本的Groom位置。

图13:普通状态下的皮肤毛发(左侧),没有RBF约束条件时的皮肤形变(中间),带有RBF约束条件的相同皮肤/毛发(右侧)

光源近似

毛发的着色方法旨在尽可能模拟光线照射在真实毛发上的复杂表现,同时不会超出实时渲染的能力范畴。

在现实中,我们看见的毛发色彩会受到许多因素的影响:毛发本身的色彩、光线照射的方式、光的折射与散射,以及其他发丝折射的光线对其产生的影响。

下图简单展示了光线照射到毛发的发丝时发生的情况。发丝既有反光性,也有透光性。部分光线会被发丝直接反射,形成光泽和高光;其他光线则会被发丝吸收,随即散射。

图14:毛发发丝的横截图,以及在光线照射下的活动

被发丝吸收的光线有两种散射方式:可以直接从发丝的另一侧射出,也可以在发丝内反弹后射出。这两种光线散射方式被称为“纤维散射”,以表示毛发独特而复杂的外观。这个现象众所周知,名为“双向散射分布函数”(BidirectionalScatteringDistributionFunction)的数学函数也对此进行了充分描述。

另外,从纤维中逸出的光线可以散射到其他纤维中,从而导致“纤维间散射”。这种效果更为复杂,因此计算起来耗时更久。

在考虑光线影响毛发渲染的各种方式时——包括阴影、环境光遮蔽、背光等——散射光对数千根毛发发丝的作用会变得极为复杂。例如,人类只需要看一眼外表,就能轻易而举地分辨出仿冒与真实的动物毛皮,这主要是由于光对毛皮的影响方式(而不是发丝的色彩)。如果我们要创造出栩栩如生的CG毛发,就必须考虑到所有这些光照效果。

早期的CG毛发着色方式会尝试模拟光线照射到毛发时的物理效果,虽然效果确实非常逼真,但对计算的要求巨大,渲染时间极长。然而,一些较快的“捷径”运算已经被开发出来,其效果已经非常接近于真实的物理效果。虚幻引擎使用了众多近似手段,使得实时渲染时也能得到逼真的毛发效果。

图15:头发的CG渲染,结合了反射光(最明亮的区域)、散射光(中等亮度、呈现头发色彩)和只有少量光线触及的黑暗区域

以双重散射(dualscattering)

近似为例,该方法会将复杂的散射现象分解成两个部分:全局散射会粗略/宏观地评估光线穿过纤维/毛发的方式;局部散射会通过简单的模型评估光线在单根纤维周围的反弹。与计算每个光源在一系列毛发上产生的效果相比,计算双重散射效果所需的时间会大幅减少,所获得的效果却与其他运算密集型的方法相似。

另一种能够在近似表现毛发真实感时节省时间的方法是使用深度不透明贴图(deepopacitymaps)。这种方法会为每个光源创建专属的阴影贴图,将毛发吸收信息存储在多个阴影贴图图层里。由于贴图会跟随散发毛发的物体的形状,所以不需要太多的贴图,也能实现多个不透明阴影贴图所能取得的真实感,让这种方法的运算变得更为快捷。

图16:不透明阴影贴图(左侧)和深度不透明贴图(右侧)的呈现

更多有关虚幻引擎近似表现实时光照行为的技巧,可参考本白皮书的其他学习资料部分。

密度体积

图17:密度体积、样本和毛皮成果

在虚幻引擎近似表现光照行为的技巧中,另一种方法是在每一帧中创建虚拟密度体积。密度体积提供当前视口中的皮毛密度或“厚度”信息(见图17),例如比较狐獴腿部中央毛发的“厚实”外观(绿色)和腿部边缘飘拂的毛簇(蓝色)。这些反馈会为渲染系统提供必要的信息,以迅速地近似出光线在这类毛皮密度上产生的效果。

密度体积会使用体素(小型的3D占位方块),将发丝在密度体积中体素化。密度体积是毛发着色、环境光遮蔽和环境光照的默认机制,能够获得逼真的可信的背光、自阴影和照明效果。然而在虚幻引擎中,美术师还可以选择使用深度不透明贴图,对每个光源进行设置。

在为可见发丝计算完光照后,系统就会进入下一个步骤:渲染。

渲染

为了虚幻引擎中进行渲染,导入的毛发会被转换成单独的多段线。这些曲线会被重新划分为小簇的发丝分组,以便在LOD选择和剔除时使用。

当实时系统渲染每个像素中的多根纤细发丝时,有可能会出现锯齿问题。毛发的渲染可以使用多种方法,具体取决于性能和品质预算。对于实时渲染,虚幻引擎默认的主要可视性算法结合使用了MSAA(多重采样抗锯齿)可视性缓冲来提取最初可见的发丝,同时也使用了亚像素覆盖缓冲。这一结合实现了性能与品质的平衡。

在制作动画时,我们更愿意牺牲性能来换取质量,因此可以使用不同的方式,动态地构建出一列可见发丝。这可以得到更好的排序和半透效果。对于这两种算法,我们都会在压缩后输出每个像素的可见发丝列表,以减少每个像素中的采样数量。

Groom会被分成小簇以运算LOD和剔除信息。在渲染Groom时,这些小簇可以根据屏幕覆盖率和可见性/遮蔽性进行细粒度的LOD选择。这样我们就能根据屏幕上实际可见的内容,相应地更改渲染与性能开销。这种方法对于大型动物的皮毛渲染尤其适用,因为Groom可能只有一部分离摄像机很近,而其他部分距离很远。

图18:配制毛发LOD的方法

出于可扩展性,Groom系统支持不同的几何表现形式,例如发片和网格体。当Groom只覆盖到几个像素,或者为了在性能较低的平台上运行时,可以切换为更简单的渲染方式。

纤细发丝的光影

由于阴影贴图或毛发体素分辨率不足,睫毛或胡须等纤细发丝在定向光源下投射的阴影可能无法保真。为了应对这一问题,在启用光线追踪时,可以直接使用毛发几何体来投射阴影,让纤细的结构能够投射出更清晰锐利的阴影。但这么做必须谨慎,因为毛发几何体越是复杂,这一选项的性能开销就越是高昂。

人的脸部其实覆盖着被称作“绒毛”的纤细发丝。和其他毛发一样,绒毛会被所有的环境光源照亮。由于其本身颜色较浅,其光照中不可忽视的一部分来自于皮肤表面的反光。在虚幻引擎中,Groom可以选择采用这种特殊的光照成分。

模拟

对头部和身体移动、风吹、重力等因素做出反应时,真实的毛发会以特别的方式运动。毛发由于这些外力所产生的动画通常是通过基于物理的模拟实现的,而这非常依赖运算。然而,为了在动画中实现照片级的真实感,在制作这些受到外力和运动影响的CG毛发模拟时,就需要创作出栩栩如生的动画。

毛发数量繁多,并且物体碰撞和自我碰撞的运动都非常复杂,因此很难模拟。毛发的动力学依赖于复杂的相互依赖关系。就动物皮毛而言,除了毛发本身的模拟作用,有很大一部分毛发动态效果是由肌肉负责驱动的。

用于模拟的导线(不一定要与毛发导线相同)会驱动相关插值曲线的形状和运动。导线的选择可能比导线的数量更重要——质量的重要性远胜于数量。

Groom中的Groom导线通常会提供某种结构,例如聚丛、方向变化、流动等。结构通常需要在模拟期间维持,所以Groom导线是模拟的良好起点。如果这些Groom导线无法提供足够的分辨率,用户可以使用Groom衍生的其他模拟导线来予以补充。如果你的主要


转载请注明:http://www.180woai.com/afhpz/7701.html


冀ICP备2021022604号-10

当前时间: