欢迎光临散文网 会员登陆 & 注册

unity学习笔记 vol.91 走近卡通渲染--关于Trick的二三事 ShadingModel 面部、头发

2021-12-02 08:38 作者:NXL2  | 我要投稿

纯笔记,OCR加手动校正。

原地址:https://learn.u3d.cn/tutorial/cel-shading-trick?tab=materials#617bc25fb945680020f292ea

网易TA带你走近卡通渲染(上)

网易TA大咖带你走近卡通渲染(下)

下面我就围绕着这个渲染,来讲解一下相关的Trick。卡通角色还原中存在的几个问题,首先是对传统的卡通角色来说,剪辑起高度二分的交界边缘是灵魂,但是在3 d 的光照中平滑并且锐利的阴影边界在制作中是非常难以还原的,第二个问题就是在不同视角下卡通角色的外形会有不同的夸张与形变,这种特征是非常难以还原的,并且卡通渲染也会有很多不物理的表现,比如一直存在的高光和暗的阴影,最后一点就是色彩了,高饱和度的纯净的色彩是卡通渲染的特征,但是因为有不同设备之间 HDR 与 IODR 的转换,其中会使用到 tone mapping,这就会导致卡通渲染的色彩问题。这些问题都需要各种各样的Trick来解决。

那么我们首先来讲面部上的处理,对面部主要是阴影修正的问题,节时的光照是没有面部阴影修正这些问题的,物理的应用表现是符合我们日常的习惯的,但是在强调边缘刻画的二分光影上,不做干预的面部阴影形态就会过于显得凌乱,就像左图这样,这对于高度概括的卡通表现来说是非常违和的,纠正方式主要有对法线和拓扑的修正和距离场记录光照的方式。

首先是法线修正,包括贴法线,这种方式主要使用求包括体或者结构简单的包括体法线去映射到面部法线上,就像左图这样,使面部显示出对应包括体法线的阴影,这种方式的操作比较简单,效果也简单就是包括体的阴影。

那么更进一步,把模型拓扑也改成对应阴影拓扑,在这个基础上再调整法线,就可以得到拓扑结构中的阴影形状了,这也是《罪恶装备》中分享的方法,是应用比较广泛的修正方式。这种方式的缺点就是,虽然可以调整出理想的形状,但是法线调整是非常繁琐的和耗时的,并且这种方式会导致阴影的跳变,就像右图这样,阴影会在两个形态之间快速的切换。

然后就是使用距离场的方式,这种方式将绘制的光照储存到距离场中,之后根据光源方向取出距离场中对应的阴影形状,通过这种方式,我们可以方便的自定义,阴影变化的过渡,不过为了保证阴影边缘信息的准确,这张图需要的精度就是比较高的,并且由于缺少光照外轴的变化,它只能有一个单方向的光照信息,利用多张 SDF混合可以解决这个问题,不过这样制作就比较繁琐了,具体的计算已经有很多文章讲解了,这里就不再赘述。

面部还有一个小特征就是,暗部的鼻尖补光,对于鼻尖的高光来说,一般是为了暗部的面部不至于过平,所以才加上的,对鼻尖进行补光的方式,我们可以使用一张 mask 来标记鼻尖的位置,然后同时呢我们也可以复用这前面所说的SDF的思路,去给这个鼻尖高光加入动态的效果,图中就是SDF的鼻尖高光,可以在这里看到他的效果。

然后来说一下头发,对于头发来说,重要的表现就是阴影和高光了,阴影比较简单一般是绘制阴影贴图,然后配合光照计算来表达,主要来说一下高光,首先头发是具有各向异性的,各向异性就是物体微观表面,各个方向的粗糙程度不同,然后它是一种宏观表现,右边的两个金属球,是左边是GGS高光,右边的是各向异性的GGS高光,可以很清楚的看出各项异性高光的特征,所以头发显示出来的高光,就是环状的高光,而不是半点状的高光,这一点很多动画中也会有体现,还原的话,主要是通过增加各向异性或者直接画到贴图上用 uv 采用的方式。

现来说各项异性,头发上使用最广泛的模型是 kk 模型,kk最初在1989年发表,ATS是在ShaderGraph和 gdc 中分享了一个,Hair Redia的Shading,然后这里面使用了 kk 来计算光照,头发的高光,这也是各种资料中最常见的方式,k k 最核心的计算就是将Blinn-Fhong中 n,dot h 的法线 n 改为了切线,t 将切线加入到了光线的计算中,然后从而得到各向异性的环状高光,图片下面的代码就是 kk 的各向异性计算,这里就不详细讲解了。值得注意的是,图片中的切线方向是沿发丝方向的,而一般制作时切线方向通常是垂直于发丝的,所以这里,通常是使用副切线来计算的。

因为 kk 发表时实在是太久了,所以03年的时候,就有了一个Marschner模型提出,在下面的图中左边的是 kk 模型,啊在下面的图中左边的是 kk 模型,中间的是Marschner模型,右边的是真实头发,可以看出这个模型会更加物理。

这个模型描述了光在头发中的,传播的主要路径,分别是反射的光路R,先透射再反射再透射的光路TRT,透射在透射的光路TT,不过这里不细讲这个模型,讲这三条光路的主要原因是,他们贡献了头发高光的主要特征,分别是主要镜面反射高光,次要镜面反射高光和透光,主要镜面反射高光和次要镜面反射高光,就是卡通头发中经常使用到了两层高光,叠加计算方式的来源。

ok 那么使用,上述各向异性计算,我们就可以,获得围绕头发一圈的环状高光了,之后再加上遮罩和扰动,便是常见的各向异性高光表现了,这里我提亮了第一层的高光强度,让高光明显了一点,另外在 kk 的计算中,有一个smooth step 函数,其中的 a 可以控制单向的渐变过渡,这样就可以获得左图这种,一软一硬得过渡变化了。

不过在这其中还有一个问题,那就是切线修正的问题,各向异性的计算是依赖于切线的,但是没有经过处理的切线,计算出来高光会非常混乱,就像右图一样,统一切线的方向才能,计算出像左图一样整洁的高光形态。

对于切线的修正,主要有两种方式,一个是打直 uv,另外一个是绘制FlowMap,因为切线的方式是和uv 的 u 轴有关的,所以打直 uv 以统一切线方向是最常见的方式,另外也有使用Houdini,Krita之类的软件来手动绘制,或者生成FlowMap,来指定切线方向的方式,而且如果头发是一个类似于球体的形状,也可以虚拟一个球心,然后通过计算确定切线的方向。

好讲完了将会麻烦的各向异性高光,那么把高光画到贴图上,然后直接贴到模型上的方式也十分常见,不过因为绘制的高光没有动态反馈,会比较死板,所以很多方案中也会加入相对应的动态变化,比如《蓝色协议》中就是先画高光,然后通过预先烘培的贴图,去计算出来高光的重心,之后再根据视角去缩放高光的大小,《樱花大战》中是把 uv 排列整齐,然后把高光贴图贴上去,通过高光贴图的上下移动,来表现动态的变化,总之头发高光最重要的两点,就是好看的形状和动态的反馈。


unity学习笔记 vol.91 走近卡通渲染--关于Trick的二三事 ShadingModel 面部、头发的评论 (共 条)

分享到微博请遵守国家法律