【学习笔记】3D风格化角色渲染 (卡通渲染/三渲二/NPR)


只对原理进行简单科普总结,仅代表个人、当时的观点。第一次写专栏,没什么排版经验,有点乱,见谅😭
经过这段时间四处查找资料,发现日式三渲二玩得好的大佬和做MMD的大佬有很大一部分重合。原理都差不多,只是在游戏引擎中和在建模动画软件中实现的方式有些不同。前者优化较好擅长实时渲染,后者质量更高适合离线渲染。(其实只要技术够牛,做出来的效果都会很棒)

目录
效果演示
三渲二游戏角色贴图拆包
技术简析
一、脸部漫反射——阶梯状的动态阴影
1.基于有向距离场(SDF)实现的面部阴影
2.包裹体法线
3.模型拓扑+法线修改
二、身体漫反射——动态阴影、静态阴影
1.ramp降低色阶
2.冷暖色调分离
三、描边
1.基于法线和视角计算得到的描边
2.基于几何方法生成的描边
a.将物体改用正面剔除再渲染一遍
b.将顶点沿法向膨胀一定距离
c.物体背面的三角面每一条边沿法向移动一段距离
3. 基于图像后处理的描边
4.本村线(处理衣物褶皱等内描边)
四、高光
1.特定形状的高光
2.头发的高光(天使环)
a.基于各向异性
b.基于UV
五、边缘光——菲涅尔
六、其他效果
1.明暗交界线
2.阴影颜色统一
3.皮肤次表面散射
4.为实现画面效果,面对镜头产生畸变

效果演示
下面是加三渲二shader前后的对比图(请忽视裙子背面渲染错误 几个月以前的图了,很难修)


下面是身体漫反射的对比图


下面是调节描边粗细的对比图(使用的是基于模型面法线和视角计算得到的描边)



三渲二游戏角色贴图拆包
以原神为例,看一下角色的贴图有哪几种:
Albedo 基本色
metal 金属
ramp 色块渐变
lightmap 皮肤、阴影、高光
R——高光强弱 G——阴影权重 B——高光范围
在研究一位up主利用blender还原原神渲染的工程时,发现工程中只有【Albedo 基本色】和【lightmap 皮肤、阴影、高光】两张贴图同样较完美地实现了效果,但使用了大量且繁杂的节点。实际在游戏中应该为了节省算力,用现有的贴图代替了渲染运算。

技术简析
下面重点介绍各种主要效果和实现思路:
(我也是刚接触的菜鸟学生,不少知识都比较缺乏,因此讲得很简略,建议逛知乎,一些在职的TA大佬写了很多文章,讲的都非常好)
一、脸部漫反射——阶梯状的动态阴影
如果没有这一步,角色面部如刘海、下巴、颧骨、鼻子的阴影会非常僵硬的投射在脸上,非常难看。如下图:

下面讲几种调整面部阴影的方法:
1.基于有向距离场(SDF)实现的面部阴影

简单来说就是用多张黑白图生成一张阈值图,通过修改阈值来控制阴影形状(上图)
也是原神中采用的方法。
参考文献:https://zhuanlan.zhihu.com/p/361716315【卡通渲染之基于SDF生成面部阴影贴图的效果实现(URP)】
2.包裹体法线

主要使用球包裹体或结构简单的包裹体法线去映射到面部法线上,使面部显示出对应包裹体的阴影形状。
这种方式操作简单,效果也简单就是包裹体的阴影,支持的场景比较有限。以面部模型为基础简化的包裹体也很难有理想的效果,所以应用上不算广泛。(我自己做着玩就用这种,毕竟简单方便,而且菜狗也弄不好另外两种,技术力人手都跟不上)
3.模型拓扑+法线修改

罪恶王冠中分享的方法,法线修改的plus版,是应用比较广泛的修正方式。即把模型拓扑也改成对应阴影形状的拓扑,在此基础上调整法线,从而得到拓扑结构中的阴影形状。
拓扑的方式可以调整出理想的形状,不过法线的调整是非常繁琐与耗时的,并且这种方式会导致阴影产生跳变,即在两种阴影形态之间会快速切换。
参考文献:https://zhuanlan.zhihu.com/p/411188212【二次元角色卡通渲染—面部篇】
这一部分基本是这篇文章的概括,想详细了解可以去原文那里,大佬很牛,写得非常详细,值得收藏仔细研究。
二、身体漫反射——动态阴影、静态阴影
1.ramp降低色阶

即用一张ramp贴图的uv映射到光照模型(如半兰伯特)中,来控制漫反射的颜色。可以做出好看的光影渐变效果。ramp贴图可由美术制作并调整,实现指定的效果。
参考文献:https://zhuanlan.zhihu.com/p/248998437【技你太美_UE4_Ramp生成器_仿原神皮肤shader】
2.冷暖色调分离

三、描边
1.基于法线和视角计算得到的描边

这部分的计算依赖于我们的一个直觉观察:当我们的视线和某个表面相切时,这个表面上的像素点往往就是模型的边缘,基于这个观察,我们可以用dot(viewDir, normal)^{k} 来估计一个像素的“边缘程度”,当然,这个值也可以用来作为纹理坐标去采样一张预定义的“轮廓纹理”。
2.基于几何方法生成的描边
这类方法的特点是描边本身是一个单独的几何体,通过特殊的方法绘制出描边。
a.将物体改用正面剔除再渲染一遍

首先在绘制结束正常的模型后,将需要描边的物体改用正面剔除再绘制一遍,在VS中将顶点沿着法线方向膨胀一定距离,然后在FS中将模型用纯色输出。
b.将顶点沿法向膨胀一定距离

Triangle Shell(三角面背面扩张法)是过程式的几何描边中最广为使用的算法。其算法核心是将顶点沿着法线方向移动一段距离,并且为了让扩张的背面不会因法线的方向过多地向Z轴的负方向移动(相机方向),从而盖住原本的物体的正面,我们需要手动设置在转换到观察空间下的法线的Z值
c.物体背面的三角面每一条边沿法向移动一段距离

Triangle fattening法是将物体背面的三角面的每一条边沿着法线方向移动一段距离。但由于三角形角度的不同,可能造成某一个角附近的描边特别厚,正如左上图。
总结:原理简单,容易实现,而且对于大多数物体来说都能有着不错的描边效果,但因为有两个Pass,需要对Mesh进行两次绘制,性能上有一定的开销。
3. 基于图像后处理的描边
这类方法的实现可以说更接近于“边缘”这一概念的本质定义,什么是“边缘”呢?边缘就是在深度或者法线上不连续的位置。因此为了获取边缘,我们只需要在图片上找到深度或者法线不连续的位置即可,因此,我们需要将深度信息和法线信息以贴图的形式传入,运用边缘检测算法去寻找这些像素。这类方法的优点是描边的线宽一致,缺点是需要额外的法线和深度信息,当然,由于近年来流行的延迟渲染框架,法线和深度本来就是G-Buffer的一部分,因此往往不需要额外绘制法线和深度的信息。

采用sobel算子对法线、深度图进行处理再合成(如无主之地系列)
4.本村线(处理衣物褶皱等内描边)
除了常见的外描边以外,有时为了表现衣服上的褶皱等折痕,美术会做一张纹理贴图来储存褶皱的形状。在游戏《罪恶装备》里,就使用了这类贴图。

本村线贴图有一个很显眼的特点:所有的线横平竖直。这是因为如果有斜向的线段,在UV采样中会产生锯齿。

所以,使用本村线的UV是经过美术特殊处理的,对于美术来说相比普通的展UV会多费一些功夫。

四、高光
1.特定形状的高光
(这部分笔记很乱,怕有错漏,待补充)
2.头发的高光(天使环)

a.基于各向异性
① Kajiya-Kay 模型
在Kajiya-Kay模型中,头发的高光不再是使用简单的法线向量和半角向量的内积值,而是使用了头发的切线方向来代替法线方向。


②Marschner 模型
真实头发的光路是更加复杂,光路传播包含三部分:R,、TRT 、TT
Marschner 模型更进一步,采用两种高光(一组低频和一组高频),使得模拟的效果更为真实。

b.基于UV
各向异性的计算相对复杂,可控性较差,有时就直接画在UV上。

五、边缘光——菲涅尔


六、其他效果
1.明暗交界线


很多动漫和游戏中为了强调明暗交界、兼顾美观,会在两种色块之间添加一条偏红的分界线。实现方法有ramp图和函数计算等。
2.阴影颜色统一

如上图,暗面分为“阴”与“影”两部分,物体偏暗的被光面称为“阴”,投射在其他物体上的影子为“影”。若阴与影颜色一致,色调会更加干净。光感更好、更加卡通。
3.皮肤次表面散射

次表面散射(Sub-Surface-Scattering)简称SSS,用来描述光线穿过透明/半透明表面时发生散射的照明现象,是指光从表面进入物体经过内部散射,然后又通过物体表面的其他顶点出射的光线传递过程。
用人话来说,就是把手指放在手电筒前,光线透过手指射出的光不是皮肤的黄色,而是内部血液的红色。
在渲染中为皮肤添加特定的SSS将会体现出一些红润效果,更加真实(也更涩了)。
4.为实现画面效果,面对镜头产生畸变


显然,很多动漫中的比例与形状并不严格符合透视原理(上图)。
有时为了夸张而对肢体进行一定程度的形变(高分少女、jojo等);有时为了面部美观而对五官进行扭曲(各种非正面角度的面部镜头,特别是侧颜),不但不会翻车,反而更加好看。
但游戏的实时渲染中镜头角度有不可预测性,如果做不好很可能会引起恐怖谷效应(印斯茅斯面容.jpg),因此更多用于CG中或视角变化较少的游戏中。

把这些技术列出来做成一个目录而已,不少东西还有待研究
感觉说了很多,实际上啥也没深入💩
大概是给外行科普用的吧
