绝区零 · 橘福福
七层 Ramp 区间(ShadowFade → Forward)对漫反射分段染色,配合 MaterialID 让皮肤 / 衣物 / 头发各自独立配置曲线。
独立作品
- ENGINE
- Unity · URP
- TECH
- NPR · Shader · HLSL
- ROLE
- Shader
- YEAR
- 2026
案例目录11 小节
最终效果
本作品集中的NPR角色渲染Demo基于Unity URP,还原以miHoYo系为代表的日系卡通渲染风格,涵盖从光照模型到后处理的完整渲染管线。 最终效果如下,使用URP下的ASES,Bloom等配置

效果拆解
动态Ramp(直接光漫反射)
以NdotL为输入,通过七层Ramp区间(ShadowFade / Shadow / ShallowFade / Shallow / SSS / Front / Forward)对漫反射进行分段染色,每层的offset/bias/scale参数均可在运行时调整;配合MaterialID,不同材质区域(皮肤、衣物、头发)可独立配置各自的Ramp曲线。

描边
使用BackFace描边,将平滑法线数据烘焙到模型的UV2通道,然后在outLinePass中解析,搭配MaterialID和顶点色进行分区染色以及粗细控制

屏幕空间投影
头发和衣物基于深度缓冲实现屏幕空间自投影。相较于传统ShadowMap方案,无需额外Shadow Pass,适合移动端预算;代价是角色移出屏幕边缘时投影会裁切,属于已知取舍。

间接光漫反射
间接光漫反射沿用URP的球谐光照,额外暴露强度和色调参数,允许美术按场景氛围整体调色。

间接光镜面反射
减小移动端压力,无法负担实时反射探针的情况,使用MatCap模拟金属镜面反射,在保持效果的同时降低运行时开销,使用MatCap颜色与漫反射进行叠加混合,控制金属反射

对比效果如下,可见高光区域金属感的差异

直接光镜面反射
使用移动端优化的GGX算法,头发部分则是使用球形法线来计算

对比效果如下,开启后金属部分更加明显,同时也显示了头发高光

边缘光
屏幕空间边缘光,配合MaterialID,分别控制染色和强度

面部阴影和鼻线
因为阴影在面部有局限性,尤其是形态键的面部表情,因为法线的缺陷会导致阴影很丑,所以必须单独处理 可见形态键生效时法线变化很大,阴影会有很大问题

通过采样面部SDF图,单独对面部阴影处理,通过计算灯光与面部的夹角来改变UV采样方向 使用SDF因为不是直接对法线操作,所以不能完全处理阴影瑕疵,但是可以极大缓解问题,如果不使用SDF,使用圆柱法线传递的方法也是可以的

除了阴影之外,额外对鼻线进行处理,仅在正面视角显示,侧面则有描边线替代

眼睛透过头发
眼部在渲染顺序上位于头发之后,通过Stencil Buffer标记头发遮挡区域,再以额外Pass重绘眼部,避免穿帮
