剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染 (11)

并且在调用MainPS前,已经由其它代码计算好了漫反射颜色,后续还会进行高光混合。如果在预计算卷积核之前就混合了高光,会得到不好的渲染结果:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

2.3.4 UE次表面散射的限制

UE4的次表面散射虽然能提高非常逼真的皮肤渲染,但也存在以下限制(摘自官方文档:次表面轮廓明暗处理模型):

该功能不适用于非延迟(移动)渲染模式。

将大屏幕设置为散射半径,将会在极端照明条件下显示出带状瑕疵。

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

目前,没有照明反向散射。

目前,当非SSS材质遮挡SSS材质时,会出现灰色轮廓。(经笔者测试,4.22.1并不会出现,见下图)

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

2.4 皮肤材质解析

本节将开始解析Mike的皮肤材质。皮肤材质主要是M_Head。

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

皮肤材质节点总览

它的启用了次表面散射的着色模型,此外,还开启了与骨骼动作和静态光一起使用标记,如下:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

2.4.1 基础色(Base Color)

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

对于基础色,是由4张漫反射贴图(下图)作为输入,通过MF_AnimatedMapsMike输出混合的结果,再除以由一张次表面散射遮罩图(T_head_sss_ao_mask)控制的系数,最终输入到Base Color引脚。

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

4张漫反射贴图,每张都代表着不同动作状态下的贴图。

其中MF_AnimatedMapsMike是一个通用的材质函数,内部控制着不同动作下的贴图混合权重,而混合不同动作参数的是m_headMask_01、m_headMask_02、m_headMask_03三个材质函数:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

而m_headMask_01、m_headMask_02、m_headMask_03三个材质函数又分别控制了一组面部Blend Shape动作,其中以m_headMask_01为研究对象:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

由上图可见,m_headMask_01有5张贴图(head_wm1_msk_01 ~ head_wm1_msk_04,head_wm13_msk_03),利用它们的共19个通道(head_wm1_msk_04的alpha通道没用上)提供了19组blend shape遮罩,然后它们与对应的参数相作用。

此外,m_headMask_02有3张贴图控制了10个Blend Shape动作;m_headMask_03有3张贴图控制了12个Blend Shape动作。

至于遮罩数据和blend shape参数如何计算,还得进入fn_maskDelta_xx一探究竟,下面以fn_maskDelta_01为例:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

不要被众多的材质节点搞迷糊了,其实就是将每个Blend Shape遮罩与参数相乘,再将结果与其它参数相加,最终输出结果。抽象成公式:
\[ f = \sum_{i=1}^N m_i \cdot p_i \]
其中\(m_i\)表示第\(i\)个Blend Shape的遮罩值,\(p_i\)表示第\(i\)个Blend Shape的参数值。奏是辣么简单!

2.4.2 高光(Specular)

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

高光度主要由Mike_head_cavity_map_001的R通道提供,通过Power和Lerp调整强度和范围后,再经过Fresnel菲涅尔节点增强角色边缘的高光反射(下图)。

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

上述结果经过T_head_sss_ao_mask贴图的Alpha通道控制高光度和BaseSpecularValue调整后,最终输出到Specular引脚。(下图)

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

其中鼻子区域的高光度通过贴图T_RGB_roughness_02的R通道在原始值和0.8之间做插值。

2.4.3 粗糙度(Roughness)

粗糙度的计算比较复杂,要分几个部分来分析。

2.4.3.1 动作混合的粗糙度

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfffj.html