Contents

UE4基于屏幕空间的描边材质

Contents

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

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

在UE4中,我们有两种思路来做 https://img-blog.csdnimg.cn/20200217140304624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70

  1. ScemeTexture:CustomDepth

  2. ScemeTexture:CustomDStencil

第一个需要在mesh上开启renderCustomDepthPass

https://img-blog.csdnimg.cn/20200217140309501.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70

第二个需要:

https://img-blog.csdnimg.cn/20200217140313604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70

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

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

那么如何检测边缘呢,基本的思路就是在屏幕空间中,自己不是模板值,而周围是模板值,那么这样就说明是外边缘,反之是内边缘。 https://img-blog.csdnimg.cn/2020021714031963.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70 我们可以通过编辑器选择试图来看。

https://img-blog.csdnimg.cn/20200217140322444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70

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

https://img-blog.csdnimg.cn/20200217140326795.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70 所有的蓝图如上图。

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

https://img-blog.csdnimg.cn/2020021714033249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzMDMwODQz,size_16,color_FFFFFF,t_70

如果有更新以后再改把