Shader - Skin & SSS

Demo

Workflow

需要渲染出的特性:
  • 毛孔造成细碎的高光现象
  • 次表面散射造成的透光现象
金属工作流的高光参数只有光滑度,只能控制高光区域的聚集度。高光工作流的高光参数除了有光滑度,还有镜面反射率可以控制高光的反射量。渲染皮肤的方式适合使用高光工作流,可以更方便的控制高光的表现。

Specular Detail

毛孔需要有高精度的贴图来表现高频的反射凹凸变化。在限制了贴图尺寸的情况下,并且脸部通常会和身体放到一个贴图UV区域,脸部只占了其中的小部分区域。这些情况都会导致脸部的整体渲染精度不高,表达不出高频的毛孔凹凸的细节效果。
其中解决的一个思路是利用细节纹理的优势:Detail Map + Mask Map
细节纹理可以提供高频毛孔的镜面反射率,渲染出不规则凹凸的镜面反射高光效果。


上面从左往右的贴图分别是:Albedo Map,Smoothness Map,Specular Detail Map

Direct Lighting & Specular

Subsurface Scattering

实时次表面散射渲染技术主要分为纹理空间和屏幕空间,需要对贴图进行多次的高斯模糊处理和大量的贴图采样指令,这些都会在移动端造成很大的性能瓶颈。
下面介绍的两种散射实现方式,性能代价都是相对较小的,对于在移动端设备上的项目比较友好。

SSS Pre-integrated



预制作好散射的LUT贴图,将法线方向和光源方向的点积映射到贴图的U坐标,再添加一个曲线参数(Curvature)映射到贴图的V坐标。用映射后的UV坐标采样LUT贴图,替换BRDF中的漫反射项。

Direct Diffuse & Scattering

SSS Back-facing

当观察的视角在模型的背光面时,散射会导致模型出现透光的效果,仿佛模型有略微的透明。

大白的身体出现略微的透光

从渲染微平面的角度分析,触发这个效果的条件是当光源和视角的方向相反,视线看向物体的背光面,即光源方向和视角方向的点积小于0。再加上光源的强度衰减,得到了散射在微平面上的颜色,看做一个额外的自发光项。

half dotNL = dot(inputData.normalWS, light.direction);
half transPower = dataSSS.translucencyPower;
half3 transLightDir = light.direction + inputData.normalWS * dataSSS.distortion;
half transDot = dot( transLightDir, -inputData.viewDirectionWS );
transDot = exp2(saturate(transDot) * transPower - transPower);
half3 lightColor = light.color * lerp(1.0, light.shadowAttenuation, dataSSS.shadowStrength) * light.distanceAttenuation;
half3 color = dataSSS.color * transDot * (1.0 - saturate(dotNL)) * lightColor * dataSSS.translucencyStrength;


评论

此博客中的热门博文

Shader - Hair & Fur

一个Mesh的半透明类型