- 0
- 0
- 0
分享
- 卡通材质原理
-
2022-03-16
本文转自公号:Thepoly
Hello . 大家好
今天搞个卡通玩
我是木偶心没
Cel Shading(Toon Shading,Cartoon Shading)叫卡通渲染(着色),它是一种NPR(非真实感渲染)的技术,Cel的全称是Celluloid(音译赛璐璐或赛璐珞)
赛璐璐风格是指颜色阴影都是硬性边的上色方法的一种风格
下面我们就开始把我们的卡通效果进行分解
首先是光照强度,将Blin-Phong的光照模型简化后得到光照强度x颜色信息=最后的图像颜色(当然肯定不合逻辑,但是主要看效果)。所以关照强度就=最后的图像颜色/颜色信息。但是由于最后的图像颜色信息不是个单通道的,所以我们把最后的图像颜色和颜色信息都去饱和再进行计算。
这里开始进引擎实现效果。这个效果我们在后处理postprocess里面去实现,所以首先给一个无边界(unbound)的post process volume,并为其创建后处理材质。
按照上面的用最后的图像颜色和颜色信息去饱和后相除就可以获得光照强度。所以在场景中就可以看到场景中的明暗变化
然后来取消掉中间过度的灰色,即大于0.5取1成为亮面,小于0.5取0成为暗面.并为亮面和暗面分别添加强度控制和颜色控制。
再把场景颜色加进来
高光的提取主要就是先把specular从场景中提取出来,然后和去了饱和度的最终图像相乘再进行power计算
材质里面实现效果如图
给了个蓝色的高光并把高光的效果和之前的亮暗面效果加在一起
天光的提取主要是从最终的颜色里面把basecolor抠掉,再抠掉光照强度,这会得到包含天光在内的其他颜色光。
我们往场景中加入一个绿色pointlight,然后用最终的颜色除以basecolor再除以光照强度,得到如下效果。
把最后结果乘到之前的结果中。
通过Sobel算子基于深度进行边缘检测,即计算9个像素在水平方向和竖直方向的深度变化。
比如说p5周围有8个点,要计算竖直方向的变化的话,公式就是;2表示上下所占的权重比较大。
水平方向的变化计算,同样左右占的比例比较大。
P表示点的深度值。所以最后总得变化值就是Gx和Gy斜边的值,即根号下Gx的平方+Gy的平方。但是由于引擎在计算根号这种效率比较低,所以可以直接简化为|Gx|+|Gy|。
由于只是对特定物体进行描边,所以在场景里面要把需要进行描边的物体勾上自定义深度。具体引擎里面的节点如下。
用lerp把外描边效果加到场景颜色中。
内部描边主要是基于法线进行的,求一个像素周围上下左右四个点的法线变化。
P3是当前像素点的法线。P=(p3-p2)+(p3-p4)+(p3-p1)+(p3-p5)
所以只需要判断P这个法线是否有变化就可以了,简单的办法就是把p的三个分量相加,如果三个分量相加等0就是没有边界。但是由于法线可以是负数,所以我们要取绝对值abs(Px)+abs(Py)+abs(Pz)。
引擎中实现效果
将内描边也叠加到场景中
提取思路还是先提取光照强度,然后power,抠出不够亮的光和不需要着色的哪部分,然后用sobel进行边缘检测,最后乘上basecolor
详细节点
最后把所有的颜色合到一起
最后把背景天空给弄出来,将场景深度和自定义深度进行比较,相等的话代表需要进行卡通处理的部分,除此以外渲染场景本身的颜色。
最终效果如图
- End -
-
阅读原文
* 文章为作者独立观点,不代表数艺网立场转载须知
- 本文内容由数艺网收录采集自微信公众号CG世界 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。