首先,看需求是什么,是否要透视,是内描边还是外描边。根据不同的需求都会有不同的思路。

为什么是在屏幕空间呢,据法线做当然是可以的,但是如果需求上不能这么做,例如法线很乱,什么光滑组什么破玩意的,那就只能只用基于屏幕空间来做了,而为什么在其他空间没有办法做呢,目前认为是因为没办法做边缘检测,只能知道自身的信息,所以才只能在最后做,现在不太清楚虚幻的渲染流程是什么样的,所以不敢妄加推断。

在UE4中,我们有两种思路来做

  1. ScemeTexture:CustomDepth

  2. ScemeTexture:CustomDStencil

第一个需要在mesh上开启renderCustomDepthPass

第二个需要:

然后把我们的材质做好后放在postprocessVolume的PostProcessMaterial中就可以了。设置后这个设置就是全局的啦。

第一种方法是自定义深度,然后深度和周围的像素深度进行比较,如果是边缘那么就发光。第二个是自定义模板,跟深度做法上是一样的,并且更加的灵活和复用,毕竟只要开启自定义深度就只能使用全局设置,这样也只能有一种颜色。

那么如何检测边缘呢,基本的思路就是在屏幕空间中,自己不是模板值,而周围是模板值,那么这样就说明是外边缘,反之是内边缘。 我们可以通过编辑器选择试图来看。

我们使用如上图的方式来实现检测单个点的像素是否是mask。

所有的蓝图如上图。

最后一个问题就是随着视角的拉远,边缘光的像素并不会根据视角而缩小,最简单的就是随远近缩小

如果有更新以后再改把