卡通渲染NPR-兰伯特篇-01

游戏内实际截图

20220707001122

模型查看

unlit 和 lit材质

20220707001338

描边

具体做法可以看这一篇

这里直接使用了 法线外扩 的方案来实现了描边

卡通渲染NPR-描边篇

控制描边的粗细

这里的实现方案是使用法线的长度来控制法线外扩的距离

直接输出法线的长度当做颜色,可以看到部分地方法线长度较短(颜色较暗),为了避免描边过重的问题

20220707002244

将描边和unlit进行整合效果预览

20220707002313

自定义兰伯特

默认的兰伯特和半兰伯特都有一些局限性,过暗或者过亮的情况,这里希望更自由的控制兰伯特的强度

1
2
3
4
float lambert(float3 normal, float3 lightDir, float lambertScale = 0.0f)
{
return clamp(dot(lightDir, normal), 0, 1) * (1 - lambertScale) + lambertScale;
}

叠加兰伯特效果后对比

20220707002705

基于兰伯特的值再次进行二值化操作

伪代码

1
2
3
4
5
6
7
8
9
float lambert = xxx;
if ( lambert < 0.5 )
{
lambert = 0.5;
}
else
{
lambert = 1;
}
20220707003023

需要注意的一点:是否和自定义兰伯特进行叠加

如果不叠加:会让画面更纯净

如果叠加:会带一点点的参差感,具体可以看期望的美术风格

20220707003158

效果图

20220707003355