PBR渲染(二)——PBR皮肤渲染

PBR皮肤渲染

在PBR基础框架的基础上实现皮肤的渲染,要根据皮肤的渲染特性来对基础框架进行扩充和修改,从而实现真实感的PBR皮肤渲染。皮肤一般具有以下渲染特性:

1.次表面散射(SSS)
2.BRDF高光(Specular BRDF)
3.细节贴图(Detail Normal:脸部法线一般只包含宏观褶皱,皮肤的微观毛孔肌理可通过一张Tilling的细节法线来表现)
4.粗糙度Roughness
6.环境光遮挡AO
7.清漆涂层(ClearCoat)

1.次表面散射(SSS)

使用预先积分次表面散射(Pre-Integrated Skin )的方法来实现。这种方法用来模拟Diffusion Profiles:
1.采用预积分的LUT来模拟Diffusion Profiles
请添加图片描述

  • 首先对要对LUT贴图进行采样,采样的UV是(NOL,Curvature),分别是NdotL的值和曲率,然后将采样结果替换掉漫反射中的光照强度NOL。

  • 而对于曲率值则可以使用下面的函数计算得出,函数是通过求导的方式计算出曲率。
    请添加图片描述

  • 这种方法得到的次表面散射效果还是比较生硬,接下来对其进行柔化。

2.使用三种不同模糊程度的法线图分别计算R、G、B三种波长的漫反射光照,进一步模拟Diffusion Profiles

  • 使用三种不同模糊程度的法线对LUT进行三次采样,再进行混合,得到最终的次表面散射结果请添加图片描述
  • 通过修改原法线图的mipmap层级来得到R通道的法线图,另外两个通道法线由R通道法线和原法线插值得到,然后再使用三个通道的法线对LUT进行三次采样并混合。

2.BRDF高光(Specular BRDF)

  • 对于皮肤的渲染,首先将原PBR框架的金属度移除,BRDF高光项的SpecularColor直接由Specular Map传入
  • 然后实现直接光BRDF双层高光(DualSpecularGGX),使用两层粗糙度计算两层Alpha2值,并在D项中利用插值因子进行混合,再使用平均粗糙度计算出平均Alpha2值用于V项计算,这一步是直接光双层高光实现。
  • 然后是间接光双层高光。同样是传入两层粗糙度参数,分别计算一次IBL高光,并使用插值因子进行混合。

3.环境光遮蔽AO

  • 开启URP的SSAO,并在Shader中进行采样请添加图片描述
  • 之后和烘培AO混合一起传入光照函数计算。

4.表面阴影柔化(Trick)

  • 在处理完高光之后发现皮肤表面的阴影还是十分生硬,并不像我们的SSS次表面散射效果那样柔和,下面进行修改。
  • 这里的解决方案是先将阴影Shadow值提亮一点,然后利用shadow值在颜色值half3(0.11,0.025,0.012)之间进行插值,从而为阴影着色,使其和暗部的颜色相近,柔和。

5.阴影区域环境光弱化(Trick)

  • 旋转光照方向,当面部完全处于阴影时,我们会发现,即使完全处于暗部,环境光仍然很亮,因为间接光照和直接光并没有直接联系,所以在旋转直接光时环境光并不会受到影响。
  • 解决方案是将阴影Shadow值算入AO,但是这样会将环境光直接覆盖掉,所以将主光源Shadow的最小值限制到一个值(0.35),这样环境光就会达到一个比较合适的效果。

6.细节贴图

  • Detail Normal:脸部法线一般只包含宏观褶皱,皮肤的微观毛孔肌理可通过一张Tilling的细节法线来表现
  • 同样的Detail Normal也要进行一个模糊处理,然后通过一张Detail Mask将Detail Normal和Normal混合,再进行后续的SSS计算。
  • 对于这张Detail Mask主要是用来控制有些部位需要细节贴图,而有些部位则只需要普通Normal。

7.清漆涂层(ClearCoat)

请添加图片描述

  • 当材质表面覆盖一层透明清漆涂料时,光线会先在清漆表面发生镜面反射,然后剩下的光线穿过清漆层在材质表面发生漫反射和镜面反射。根据这个原理在Shader中计算并进行混合。清漆效果和之前的双层高光的区别就是光线穿过清漆层会有能量衰减,在计算时要将能量守恒考虑进去。
  • 再计算一层BRDF高光,作为清漆层的镜面反射。传入清漆层自身的SpecularColor和法线,设置清漆反射强度ClearCoat乘入SpecularGGX的F项,F项用来控制材质的菲尼尔反射,将ClearCoat乘入F项就可以控制清漆层反射强度。
  • 上面一个步骤只是叠加了一层清漆层的镜面高光,而对于表面材质并没有计算清漆层的能量损耗。首先来计算直接光能量损耗,清漆层的ClearCoatGGX的F项即可作为清漆层的能量消耗,因为F项菲涅尔反射代表了反射率。之后就可以使用这个能量损耗值去加入表面材质的漫反射和镜面反射光照计算。
  • 上面是直接光清漆效果的计算,环境光的清漆效果计算只有一点点不同,思路是一样的。首先用于环境光采样的反射光线R需要用ClearCoatNormal重新计算,之后是NoV,然后就可以计算SpecularIBL高光。间接光清漆反射强度ClearCoat乘入AO来控制反射强度,能量损耗用上面直接光的F项计算。最后就是用能量损耗值来计算材质表面的间接光漫反射和镜面反射。

猜你喜欢

转载自blog.csdn.net/qq_53057269/article/details/127480827
PBR