Rim Effect
原理是利用fresnel的模拟效果,制作出描边的效果,但是这种效果更像是“内描边”:
使用这种效果,在边缘锐利的地方,表现会比较差:
Inverted Hull/BackFace/Vertex Extrusion
最常见的一种做法,是将模型的顶点往指定方向外扩,然后再进行一次渲染:
这种方式一般是使用模型法线方向对原模型进行外扩,不过有时模型法线方向会带来一些奇怪的结果,比如空洞和断裂:
所以在这套做法的基础上会使用顶点色给模型单独存储一套描边用法线,需要搭配法线编辑的工作流;
同时,外扩模型的做法在制作无内描边的Outline和半透明物体的Outline时,会需要用到模板测试,因为渲染半透明物体时不能将外扩模型的全部部分渲染出来:
Inverted Hull的工作流
- 使用两套模型法线,一套用于阴影,一套用于描边(描边阴影可以编辑);
- 让描边粗细根据摄像机远近、FOV进行变化;
- 控制描边的顶点在裁剪空间的z分量,方便美术控制内描边;
- 保证表现在不同的Scale下相同;
- 可以基于每个顶点控制描边的宽度,方便美术控制描边笔触;
Blurred Buffer
这种方式是用来实现软描边的技术,当然,硬描边也可以使用。它的原理是在一个单独的Command Buffer里,将需要描边的物体渲染到一张RenderTexture里:
接着对这张RenderTexture进行模糊处理:
接着再将原本模型渲染的地方剔除掉,就可以得到描边结果的RenderTexture,最后将描边结果的RenderTexture叠加上去即可:
当然这个Outline的结果也是可以用StencilMask来控制的,保证它只出现在模型的后方,剔除掉InnerLine;
Jump Flood Algorithm
是一种利用距离场的原理进行描边的算法,具体的原理是将模型渲染成一张黑白图:
接着处理黑白图来得到一个边缘,这里的处理指的是对于每个像素点,判断其与模型渲染结果的距离,并将这个距离用数值来表示,这样就可以得到一个距离场(Distance Field):
利用这个角力场,就可以知道边缘在什么地方了,利用这个边缘,可以进行多次偏移和绘制,来达到不同宽度的描边:
Edge Detection
边缘检测。这是一种后处理的描边方式,是基于渲染完成后的二维图片进行的,当我们需要给一个复杂场景添加描边效果时,边缘检测是一种比较方便的方式: