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

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

其中UE默认的混合公式是:
\[ Lobe1 \cdot 0.85 \ + \ Lobe2 \cdot 0.15 \]
下图显示了UE4混合的过程和最终成像。

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

左:较柔和的高光层Lobe1; 中:较强烈的高光层Lobe2; 右:最终混合成像

非直接反射部分采用预卷积的cube map。

具体解析和实现请参看《由浅入深学习PBR的原理和实现》的章节3.3.2 镜面的IBL(Specular IBL)。

皮肤毛孔。

皮肤毛孔内部构造非常复杂,会造成反射(高光和漫反射)、阴影、遮挡、次表面散射等效应。

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

人类毛孔放大图,内部构造异常复杂,由此产生非常复杂的光照信息

在渲染毛孔细节时,需注意很多细节,否则会渲染结果陷入恐怖谷理论。

理论上,接近物理真实的渲染,毛孔的渲染公式如下:
\[ cavity \cdot Specular(gloss) \cdot Fresnel(reflectance) \]
其中:

\(cavity\)是凹陷度。可从cavity map(下图)中采样获得。

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

\(Specular(gloss)\)表明高光项。

\(Fresnel(reflectance)\)是与视觉角度相关的反射。

然而,这种物理真实,使得凹陷太明显,视觉不美观,有点让人不适:

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

尝试微调高光和cavity的位置,可获得下面的渲染结果:

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

上图可以看出,高光太强,凹陷细节不足,也是不够真实的皮肤渲染结果。

实际上,可摒弃完全物理真实的原理,采用近似法:
\[ Specular(gloss) \cdot Fresnel(cavity \cdot reflectance) \]
最终可渲染出真实和美观相平衡的画面:

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

UE4采用漫反射+粗糙度+高光度+散射+法线等贴图结合的方式,以高精度还原皮肤细节。

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

从左到右:漫反射、粗糙度、高光度、散射、法线贴图

具体光照过程跟Cook-Torrance的BRDF大致一样,这里不详述。

全局光照。

皮肤的全局光照是基于图像的光照(IBL)+改进的AO结合的结果。

其中IBL技术请参看3.3 基于图像的光照(Image Based Lighting,IBL)。

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

上图:叠加了全局光照,但无AO的画面

AO部分是屏幕空间环境光遮蔽(SSAO),其中AO贴图混合了Bleed Color(皮肤通常取红色)。

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

增加了红色Bleed Color的AO,使得皮肤渲染更加贴切,皮肤暗处的亮度和颜色更真实美观。

次表面散射(BSSRDF)。

这部分内容将在2.2更详细描述。

2.2 次表面散射

次表面散射(Subsurface scattering)是模拟皮肤、玉石、牛奶等半透光性物质的一种物理渲染技术。

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

它与普通BRDF的区别在于,同一条入射光进入半透光性物质后,会在内部经过多次散射,最终在入射点附近散射出若干条光线。

由于R、G、B在物质内扩散的曲线不一样,由此产生了与入射光不一样的颜色。

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

红色光由于穿透力更强,更容易在皮肤组织穿透,形成红色光。

2.2.1 BSSRDF

BSSRDF是基于次表面散射的一种光照模型,充分考虑了入射光在物质内部经过若干次散射后重新反射出来的光。

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

左:BRDF;右:BSSRDF,考虑了输入光在物质内散射后重新射出的若干条光

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

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