轮廓线渲染

轮廓线渲染(Silhouette Edge Rendering)一般用于卡通渲染或用于标识指定的物体。

常用的渲染轮廓线的方法有以下几种:

  • 基于法线的轮廓线渲染(Surface Angle Silhouetting)
  • 基于几何处理的轮廓线渲染(Procedural Geometry Silhouetting)
  • 基于图像处理的轮廓线渲染(Image Process Silhouetting)

基于法线的轮廓线渲染

根据表面的法线和观察方向的夹角来检测轮廓线,二者越接近垂直则说明越靠近轮廓线,通过计算表面法线和观察方向的点积,就可以推断轮廓信息。
实践中一般会用一张一维的灰度图控制轮廓线的效果

这种方法的优势是速度快,可以在一个Pass里得到结果。但是对模型有一定要求,不适用于硬边或面数较低的模型。

下图左边是硬边模型,右边是经过曲面细分的模型。可以发现这种方法有被应用于水墨风渲染的潜力。

基于几何处理的轮廓线渲染

用两个Pass,第一个Pass正常渲染正向表面,第二个Pass剔除正面,只渲染背面,通过一些特殊的方法来渲染背面来使轮廓线可见

渲染背面的几种方法

  • Edge Drawing
  • Z-bias
  • Triangle Fattening
  • Shell/Halo Method

Edge Drawing

以线段图元来渲染背面(这里不可以简单地剔除背面, “Cull Back” 对线段图元没有效果,需要根据法线和视角方向过滤掉正面的图元)

直接用线段图元渲染轮廓线的问题是高分辨率下轮廓线过细,可以考虑把线段展成长方形,用两个三角图元渲染。

Z-bias

将背面渲染为纯黑色,再沿观察方向偏置,使背面部分可见

使用这种方法的问题是,如果使用统一的偏置量会导致部分比较薄的地方会被背面完全遮挡(比如下图的兔耳朵),而且轮廓线的宽度直接取决于两面夹角,可以考虑把局部偏置量烘焙到顶点信息里,但这样要调整轮廓线的效果就非常麻烦了

Triangle Fattening

把背面三角形适当放大,从边缘拓展出的面片自然构成轮廓线。

Shell/Halo Method

将背面顶点沿其法线方向偏移,让背面像“壳”一样包围正面,为了防止背面遮挡正面,需要关闭背面的深度写入。

基于图像处理的轮廓线渲染

基于图像处理的轮廓线渲染,根据深度法线纹理(Depth Normal Texture)检测边缘

如下图(b)为根据深度纹理(a)检测到的边缘,(d)为根据法线纹理(c)检测到的边缘,两者结合可以得到比较完整的边缘信息(e)