一、效果如下图:
二、分析:
回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部,只有内部像素他的上下左右4个像素自定义深度之和才为有限值,边和外部都为无限大(这与没有自定义深度物体用无穷大填充有关),这样我们使用if语句就能判定它与无穷大的关系,从而让边和外部为描边颜色,内部为场景颜色。我们通过自定义模具得到物体外部为0内部为模具值的蒙版,这样我们可以用lerp节点,当为0时为场景色,而边和内部为上一步if语句的结果就可以了。
那么场景物体描边怎么来确定这个边呢?
边有什么特点呢?相信理解了场景深度、自定义深度和自定义模具知识的朋友们,会发现边的场景深度是不是悬殊很大?因为2个物体有间隔,所以两个物体的场景深度悬殊大,差值是不是很大?那么我们怎么得到这个差值呢?是不是边的上边像素减去边的下边像素是有很大的值?这能不能作为边的判定条件呢?
三、所涉知识点:
SceneTextureSceneDepth(场景深度)
场景深度图代表的意思是物体离摄像机越远数值就越大,离摄像机越近数字就越小越接近黑色 。测试如下图:
四、制作步骤:
1、当前像素的场景深度减去右下方像素的场景深度
根据我们的分析,如果我们把一张场景深度图减去偏移一个像素的深度图,那么在场景深度有断层的附近将会有数值相对较大的差值出现,我们就可以用这种方法得到场景的描边勾线 。
效果制作如下:
得到效果图如下:
画面有抖动,材质的可混合位置为色调映射前就解决这个问题了。
2、分析结果出现原因
上一步,我们运用之前偏移像素点的方法,以SceneTexelSize作为偏移单位,接着与保存UV各个像素点uv坐标的 ScreenPosition进行相加,然后输出给SceneTextureSceneDepth的UV来获得临近的场景深度,最后用原本的场景深度减去获得的结果,就得到了上面的结果。我会发现不是我们想要的结果。
从不同的角度去观察墙面会得到不同的效果,如下图:
为什么会出现这种情况呢?我们来分析一下:
先用场景深度图的变化来看看:
水平方向偏移50个场景文素单位后得到的图:
发现场景深度发生了移动,如果两者相减(调整下文素大小),会得到下图:
发现上图只是对左边的边就行了描边,而右边没有描边,文素大小不调整看看效果:
如果还是不理解我们可以用具体的数值进行解释:
这是右边,你会发现都是正的。下面看看左边的具体数值,都是负的,就是黑色的。
3、场景物体边缘判断
这样我们得到了左边边缘的描边,要想得到右边就需要偏移方向相反,如果我们把它们加起来就得到了左右的边缘描边,如下图:
如果你对上面不理解,那么我们还是需要具体的数值来加深理解,如下图:
经过左右偏移相加之后,你会发现除了边缘为正的,其它都是为0或者为负的,也就是黑色。
同理,我们获得上下边缘的描边再加上去。
4、拓展
(1)但是这个描边勾线还不是最精确的,因为当在同一平面的场景深度时,线框就没了。
为了得到更精确的描边勾线,我们可以用SceneTextureSceneNormal(场景法线),可以让细小的凹槽部分(面的朝向不同)也能有颜色上的差异,而颜色的差异也就是数值上的差异。
同样用上面的方法再制作一遍(这边直接复制修改SceneTexture的ID就好了),然后会得到一个法线版本的描边勾线(注意最后除的5000是为了观察效果的,得去掉,否则一片黑)。
(2)遮罩范围内是真实的,另一边是线框的效果
就是用一个遮罩来判断使用场景纹理:postprocessinput0还是场景描边。这里需要用到一个蓝图节点spheremask,知识点如下:
SphereMask的参数
SphereMask有四个输入参数。
A:待检查的位置。
B:圆心的位置。
Radius:半径。
Hardness:硬度,0是完整过渡,100是没有过渡。
输出的是一个0~1之间的数。当A在B之外时,输出0,当A在B的位置时,输出1。A在园内时,输出0~1,具体取决于是否有硬度以及位置。
注意,A和B可以1~4维的vector。
我们可以在小白人蓝图中把小白人的位置传递给材质参数集中向量参数location,其为为B的输入,worldposition为A的输入,Radius为材质参数集中的标量参数,可以让它在3秒内,随着时间变化,让它作为Radius的输入。蓝图节点如下:
后期处理材质中:
小白人蓝图中:
材质参数集:
这样的话就有了动态的效果了。
(3)如何添加遮罩的发光圈
五、参考教程:
https://zhuanlan.zhihu.com/p/87762783
UE4后期处理材质的一些应用(下) - 哔哩哔哩
【UE4】虚幻4使用后期处理制作的发光轮廓线效果_哔哩哔哩_bilibili