其实这篇文章也没什么好讲的,卡通渲染的内容已经被分析烂了,知乎上随便翻翻都能找到对各种不同游戏的卡通渲染方法的分析。这篇内容只会简单交代一下我采用的方法,以及是一个对Godot 4.5更新的Stencil内容的尝试。
外描边
外描边使用最简单的办法,也就是法线外扩。这是一个不需要改造整体管线,定制程度高的办法,越简单越好用。
单纯的外扩固定距离的话,很容易导致离近了描边过粗,离远了描边看不见的情况。这个问题的解法是获取这个顶点在屏幕空间的深度(或者是到摄像机的距离),然后将宽度乘以这个距离的一定比例即可。
Cell-Shading
目的是保证这种Shading方法能和所有光源都能产生正常互动,而不是只接受Directional Light的结果。
我这个项目的做法非常简单,就是计算光线方向与法线的点积,然后拿这个值去采样一张Ramp图即可。至于阴影部分算进这个点积的结果中,然后去采样Ramp图。采样Ramp图完成之后,乘以光源颜色即可得到结果。
点光源也是相同的处理方法,乘以衰减输入参数即可。但是由于点光源本身存在衰减的原因,实际效果可能没那么好。
由于管线限制,现在还做不到和Godot本身的GI解决方案互动,等更新。
面部着色
为了渲染鼻侧的勃朗伦光的效果,使用了通常的SDF面部阴影的方案进行实现。
刘海阴影
这是高贵的Godot 4.5支持了Stencil才能完成的新功能。
做法是给面部材质写进Stencil层。然后在头发材质的Next Pass里放一个纯渲染阴影的材质,做一定的顶点偏移,去检查面部的Stencil即可。