实现描边的几种方法

卡通渲染中,常常需要描边的效果。这里记录一下遇到的几种产生描边效果的方法。包括《Unity Shader入门精要》12、13章提到的两种方法,与另两种离线的方法。

描边效果

美术风格有很多种,其中日式和美式有种完全不同的风格,国风更有其独一无二的特点。美式动画的代表风格之一为皮克斯风格(如下图右所示),日式动画的代表风格之一为宫崎骏风格(如下图左所示)。

日式动画常基于二维美术风格表示,在色块外有着明显的边缘来区分形状,描边是这种风格的特点。当然,随着各种不同风格的碰撞与发展,描边成为各种不同美术风格的重要元素了(如下图所示),具体的描边效果,随着风格的不同而有区别。本文记录一下遇到的几种实现不同风格描边的方法。

法一:屏幕后处理中进行边缘检测

利用图像处理中的边缘检测算子,检测图像中的边(像素值跳变大的点视作边)。

法二:屏幕后处理中进行边缘检测feat.深度纹理

在法一中,边缘检测算子只在原渲染图像中卷积,采集的边只是色块相交处的边缘,而不是实际物体的边缘。改用深度纹理(或者深度法线纹理)进行卷积,能够检测出深度跳变大的点,而往往是物体的实际边缘(如下图所示,图片来自乐乐的教程)。因此这种方法更为常见。

法三:双通道渲染

这种方法思路比较简单,通过两个Pass实现描边的效果,详见这篇blog。第一个Pass在摄像机空间中沿着法线方向扩大顶点坐标,将对象渲染成黑色,且只渲染背面;第二个Pass正常渲染,且只渲染正面。这样叠加两个通道就得到了具有描边的效果。

法四:提取轮廓边单独渲染

这种常用于离线的边缘检测,对模型的所有边进行判断,判断是否是边缘(边的相邻三角形与视角的点乘正负,一正一负则为边)。这种方法常用于一些需要风格化边缘的情况。因为将边的信息提取出来后,可以用shader对边进行风格渲染。