薛山
所谓的漫画着色效果,也就是体现在角色或物体上的一层层光暗渐变,在很多漫画里都能看到这样的效果,可以很明显地呈现出角色的光影立体感。而在Blender里我们同样可以实现这样的效果,但实现的方式或许并没有大家想象中那么简单,本期我们就一起来一探究竟吧!
如果你的项目只需要使用EEVEE渲染器,那么漫画效果的着色器实现就相对比较简单,因为在EEVEE渲染器的着色器编辑器里有一个专用节点:“Shader到RGB”,也就是把原理化BSDR等着色器数据转换成RGB色彩,这个操作就相当于直接读取了物体对环境光的反射数据,然后第二步就是利用“颜色渐变”等节点模块来进行调整,大家可以自行设置自己喜欢的颜色,具体设置可参考图1。
第三步,也是最关键的一步,就在于这套设计的原理是读取物体对环境光的反射数据,因此我们只需要移动环境光源,比如默认的点光源,就能看到这个漫画渐变效果会跟随光源方向和位置进行变化,所以它具备了一定的实用性。除此之外还需要提醒大家,在设置“颜色渐变”时最好是在原理化BSDF前连接一个“纹理坐标”并尝试使用“物体”作为源,这样在拖动“颜色渐变”的滑块时才会获得更加均匀的着色效果。
至此,EEVEE渲染器的漫画渲染效果就算成功了,那么问题来了,“Shader到RGB”着色器只能在EEVEE渲染器下使用,但我们有不少工程其实在用Cycles渲染器,切换渲染器后就会发现咱们现有的这一套设置就不管用了,所以我们的第二步工作就是想办法让Cycles渲染器也能实现类似的效果!
从逻辑上来说,我们所需要的数据是光源与物体每个顶点之间的距离,然后通过数学手段筛选出想要的距离范围并着色,就能获得漫画风格的层次渲染效果了。所以在Cycles渲染器里我们首先需要利用2个“纹理坐标”来获取物体顶点与光源的距离信息,第一个“纹理坐标”选择“法向”,因为法向具有指向性,而第二个“纹理坐标”我们需要选择“物体”并新建一个空物体,之所以不使用光源作为目标物体是因为除了点光源之外,其他的光源类型往往需要旋转角度,所以使用空物体是相对比较方便的手段,我们可以把光源设置为空物体的父级,这样一来移动光源就相当于移动空物体,目的是一致的。
然后,我们需要把这两个参数先进行矢量计算的“规格化”,这个设置是把它们的数值控制在0到1之间以保证不会溢出,接着用矢量计算的“距离”得到我们想要的距离值,具体设置参考图2。
接下来我们就需要筛选出不同的距离信息来做渐变,这个操作可以通过“运算”的“大于”来进行控制,可以利用三组不同的“大于”值来得到三个不同的范围,再各自都接上“颜色渐变”,并利用“颜色渐变”右端的颜色亮度差来进行区分,然后把它们通过“运算”的“相加”来进行合并。建议不要用到太多层,按照一般的漫画风格来说,高亮、亮灰、暗灰和黑色就足够了,最后再使用“混合RGB”实现上色,综合设置可参考图3。
至此,可隨光源变化的漫画渲染效果就完成了,但注意,方法一在物体模式下旋转物体时,光影效果会随之变化,而方法二则必须应用旋转才能看到光影变化,所以如果要做动画效果,建议像图4那样给物体做一个简单几何节点,只需要在“组输入”和“组输出”之间接一个“变换”就行,这时候再调整“变换”的旋转值就可以实现与方法一相同的效果了。
看到这里,有的读者朋友可能会说“有那么复杂么?应该有更简单的方法吧,比如层权重。”没错,层权重也是实现这一效果的方法之一,我们只需要像图5那样设置,就能获得目标效果了。
但问题是,“层权重”的距离数值源自摄像机视角,它不能跟随光源或自定义的第三物体来进行调整,所以它无法得到侧光、背光等阴影效果,存在比较大的限制,这也是我为什么没有首先推荐这个方法的原因。
其实我们上期就已经强调过几何节点的强大,虽然需要一定的数学逻辑思维能力,但一旦融会贯通,它就能快速高效地实现很多以往需要大量调参,甚至可能会出现不少错误的效果。所以在未来一段时间内,几何节点都会是我们教学的主要目标,这种“编程思维”在3D设计中的重要性很高,大家务必要掌握。