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;




评论
发表评论