从描边方式上来讲,大体可分为两种,一种是对着原模型往外扩大挤出,然后通过某种方式裁剪掉与原模型重合的地方,来实现描边。另一种则是通过算法算出一张图片里,
那些地方是边缘。
1.背面渲染法
需要2个渲染通道:
其实就是把下面的模板测试换成了剔除操作。正常渲染的时候剔除背面渲染正面,第二次顶点扩张之后剔除正面渲染背面,这样渲染背面时由于顶点外扩的那一部分就将被我们所看见,而原来的部分则由于是背面且不透明所以不会被看见,形成轮廓线渲染原理。因此从原理上也能看出,这里得到的轮廓线不单单是外轮廓线。
2.模板测试法
需要2个渲染通道:
第一个渲染通道,正常渲染,同时开启模板测试,把每个片元的参考值 Ref 都设置为1,Comp Always 总是通过模板测试, 并且 Pass Replace (不写的话默认是 Pass Keep),即把当前对象所渲染区域的所有像素都用Ref值写入模板缓冲。
Stencil { Ref 1 Comp Always Pass Replace }
第二个通道,把模型往顶点法线方向往外扩一定距离(描边的宽度),在这个Pass中,我们同样把每个片元的参考值 Ref 都设置为1,Comp NotEqual 即只有当前参考值 Ref 和当前模板缓冲区的值不相等的时候才去渲染片元。也就是说,最终只会渲染出模型挤出后并裁剪掉原来模型的部分。即Pass2的渲染区域与Pass1渲染区域的一个补集。
Stencil { Ref 1 Comp NotEqual }
3.边缘检测法
这种方法其实是用屏幕后处理效果去实现的(也就是基于图像处理)。
屏幕后处理,通常指的是在渲染完整个场景得到屏幕图像后再对这个图像进行一系列操作实现各种特效。这里实现的原理其实是使用特定的材质去渲染一个可以刚好填充整个屏幕的四边形面片。
而边缘检测的原理其实就是用一个特定的卷积核去对一张图像卷积,得到梯度值,再根据梯度值的大小去判断是否为边界。
可以理解为对整张图片逐个像素进行判断,判断每个像素周围的像素,如果符合条件,那就说明该像素是处于边缘的像素
4.基于观察角度表面法线法
5.SDF法
标签:渲染,几种,Unity,描边,Pass,像素,Ref,模板 From: https://www.cnblogs.com/jeason1997/p/16874657.html