Fenglvv's Toon Shader

主观渲染的日式风格角色。模型来自 少女前线2 MMD.



介绍

这个着色器展示了渲染日式卡通角色的部分过程。
该着色器基于Unity URP,并利用URP RenderFeature 来定制渲染管线。

Shader 特性

  • 外描边:使用脚本平滑法线并转化到tangent空间,记录到顶点色rgb中,使用alpha控制描边粗细
    内描边:屏幕空间比较模型深度和周围深度,超过阈值则画为外描边
    基本着色:使用 Lambert 二分 + GGX 高光 + 环境 CubeMap + 暗部叠加渐变贴图

  • SDF面部阴影:使用角色前向和光线的夹角计算step值,将SDF贴图二分为阴影和非阴影区域
    眉毛穿过头发:将头发和面部写入模板,眉毛在最后绘制,绘制在面部和头发上方
    屏幕空间刘海阴影:将面部写入模板,将头发沿着光线方向偏移,以阴影颜色在模板区域绘制

  • 使用顶点色alpha通道控制外描边粗细,修整角色头发和面部描边

  • 法线重映射来优化高光形状
    将头发法线映射到近似球形,避免刘海亮暗二分细碎,得到平滑的头发明暗分布

  • 沿高光流动方向为头发绘制 Flow Map, 转化到 Tangent 空间,存储到贴图中
    使用kajiya-kay方法绘制双层高光

  • 使用视差方法绘制眼球,让眼球看起来具有深度

  • 使用与 Directional Light 相同方向的阴影相机单独记录特定tag物体的深度,在shader中比较阴影相机深度实现高精度的角色自投影

借物表

Unity 工具开发: 法线平滑工具