皮肤渲染技术经过数十年的发展,由最初的单张贴图+伦勃朗的渲染方式到近期的基于物理的SSSSS(屏幕空间次表面散射)。由此衍生出的皮肤渲染技术层出不穷,其中最最基础也最具代表性的是次表面散射(SSS)。
在虚拟角色渲染中,皮肤的渲染尤为关键。因为皮肤是人们每天亲眼目睹的非常熟悉的东西,如果稍微渲染不好或细节处理不足,便会陷入恐怖谷(Uncanny Valley )理论。至于什么是恐怖谷理论,参看这里。
上图由于皮肤的细节处理不到位,陷入了恐怖谷理论
2.1 皮肤的构成和理论 2.1.1 皮肤构成人类皮肤的物理构成非常复杂,其表层和内部都由非常复杂的构成物质,剖面图如下:
绒毛(hair shaft)。附着于皮肤表面的细小的毛。
油脂(oil)。皮肤表层有一层薄薄的油脂覆盖,是皮肤高光的主要贡献者。
表皮(epidermis)。油脂层下是表皮覆盖,是造成次表面散射的物质之一。
真皮(dermis)。表皮下面是真正的皮肤组织,也是造成次表面散射的物质之一。
毛囊(hair follicle)。绒毛的皮下组织和根基。
静脉(vein)。呈深蓝色的血管。
动脉(artery)。呈暗红色的血管。
脂肪组织(fatty tissue)。脂肪组织也是造成次表面散射的次要贡献物质。
其它:皮肤表面的纹理、皱纹、毛孔、雀斑、痘痘、黑痣、疤痕、油脂粒等等细节。
真实皮肤包含了非常多的细节:毛孔、绒毛、痘痘、黑痣、油脂......
2.1.2 皮肤建模皮肤表面油脂层主要贡献了皮肤光照的反射部分(约6%的光线被反射),而油脂层下面的表皮层和真皮层则主要贡献了的次表面散射部分(约94%的光线被散射)。
虽然皮肤构成非常复杂,但图形渲染界的先贤者们利用简化的思维将皮肤建模成若干层。
表面油脂层(Thin Oily Layer):模拟皮肤的高光反射。
表皮层(Epidermis):模拟次表面散射的贡献层。
真皮层(Dermis):模拟次表面散射的贡献层。
以上展示的是BRDF建模方式,只在皮肤表面反射光线,但实际上在三层建模中,还会考虑表皮层和真皮层的次表面散射(BSSRDF),见下图中间部分BSSRDF。
2.1.3 皮肤渲染流程皮肤渲染涉及的高级技术有:
线性空间光照工作流。这部分可以参看《Technical Artist 的不归路 —— 线性空间光照》。
基于物理的光照(PBR)。这部分的理论和实践可以参看笔者的另一篇技术文章:《由浅入深学习PBR的原理和实现》
大量后处理。
1~5个实时光照和1个预计算光照探头。
皮肤渲染的过程可以抽象成以下步骤:
皮肤反射。
直接反射部分采用Cook-Torrance的BRDF,公式:
\[
f_{cook-torrance} = \frac {D(h)F(l,h)G(l,v,h)}{4(n\cdot l)(n\cdot v)}
\]
具体解析和实现请参看《由浅入深学习PBR的原理和实现》的章节3.1.3 反射方程。
UE的皮肤渲染采用双镜叶高光(Dual Lobe Specular)。双镜叶高光度为两个独立的高光镜叶提供粗糙度值,二者组合后形成最终结果。当二者组合后,会为皮肤提供非常出色的亚像素微频效果,呈现出一种自然面貌。