# UE OutLine 描边
描边是卡渲比较重要的技术。UE 中主要可以通过后处理,加自定义 pass,加自定义材质来实现。本文借此机会总结 UE 描边技术和效果。
# 后处理
后处理描边的核心是采用边缘检测算法。参考文章的实现。
# Step 1 创建后期处理体积
场景中加入一个后期处理体积,名为 OutLinePostProcess。设置后期处理体积为无限大。
# Step 2 创建后期处理材质
首先,创建一个材质及其实例,命名为 OutLine。将材质实例添加到后期处理体积的 渲染功能 - 后期处理材质
的数组下。
# Step 3 创建材质函数
创建一个材质函数,命名为 MF_GETKERNEL. 由于我们要做卷积,这个函数用于方便的获取一个给定屏幕像素坐标点的周围八个点。
如图进行连线。记得重命名输入和输出。
# Step 4 材质实现边缘检测
首先将我们的材质母球如下设置。我们要保证颜色计算是在线性空间下的,因此必须在色调映射前。
初步效果如下
这里对于整个场景都进行了后处理,因为我们在材质中选择了场景深度。想要对特定的物体进行描边,我们可以使用自定义深度通道,将想要描边的物体开启自定义深度写入。
其余场景都为黑色,因为我们盖掉了他的颜色。我们只需在边缘检测不为 1 的地方使用原来的颜色即可。
# Step 5 描线颜色、发光设置
如图,将颜色和 GLoss 提升为参数,可以更改描线设置。
调高 Gloss 可以增加发光度。
# Step 6 添加蒙版 正确设置遮蔽
上图中由于只有被选中物体加入到了自定义深度渲染中,因此这些物体会相互形成遮挡关系,其他物体无法正确遮挡描边。
屏幕空间下应该没法做到完全无视所有的遮档(透视效果)。这里我们先尝试实现正确的被所有物体所遮蔽。
一般的思路应该是手动对比该点的自定义深度和场景深度来判断是否遮蔽,但是描线在物体的外侧,是没有写入自定义深度的。这种方法不大行。
这里我考虑用先前的场景深度检测一遍,然后制作一个线条蒙版来与自定义深度的边缘检测相乘来实现。
有一定效果
可见边缘被隐藏。
# Step 7 法线检测
我们的描线目前还只针对于外描线,内部的大型转折处由于深度相近无法检测,但是由法线的快速变换可以检测出来。
使用相同的方法,对法线进行检测,然后加到深度检测出来的值上。
此时,没有选择渲染到自定义深度通道的物体也会渲染。但是我们没有自定义法线通道,所以我们需要使用自定义深度通道来判断一下。
深度直接输出会发现是全白,非常大的值。我们除以一个 1e7 之后是可以看出明显区别的。
接下来是非常繁琐的操作,我们要去除其他遮蔽物体的法线,因此最终我还是使用了深度检测比较,只不过我对于周围的每一个点的深度都进行了比较,只要有一个被判定为没被遮挡我就当他是要被渲染的,否则就剔除。最终效果如下,连连看实在是做的太难看了就不列出来了。可以找我要分享。
# 材质
本来应该要改多 pass,但是 UE5.1 推出了一个叫 Overlay 材质的东西。我们只需要写一个正常的法线偏移材质即可。
# 自定义多 Pass
完全参照文章 知乎文章
# 最终效果
三种效果都不错,使用后处理还可以增加一些炫酷的光效。