虚拟数字人网

虚幻引擎中的毛发实时渲染----光源近似

cnshuziren.com 技术前瞻 2022-08-26 16:31:46

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

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

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

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

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

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

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

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

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

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

密度体积

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

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

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

发表评论

用户头像 游客
此处应有掌声~

评论列表

还没有评论,快来说点什么吧~