UE4提取场景模型边缘

在Unreal引擎的CG工作流程流程中,与灯光、合成艺术家的配合是工作流程中非常重要的一环,通常我们会将制作好的画面输出分层序列提供给合成艺术家进行视效的调整,而Unreal本身存在一个非常不友好的BUG,在缓冲层输出的结果会与主层图像在物体的边缘有1-2个像素的位置偏差,导致后期制作人员提取ID之后会造成最终产品的边缘闪烁,这次是尝试通过把主层边缘单独提取来解决TAA算法的边缘抗锯齿与Tonemap冲突造成的闪烁BUG。

这个是测试的镜头

UE4提取场景模型边缘_第1张图片

 

思路来源于B站Up主@Opsader大致是利用场景深度中被边缘遮挡的后方物体数值偏差更大,从而进行上下左右四个方向上四次像素偏移相减后得到的数据相加,得到边缘部分差值与其他地方相差较大的mask

这里用到相加而不是相乘的原因在于,我们视觉上所看到的黑并不是绝对0值,详见之后得到的负值也会在图像上显示黑色

UE4提取场景模型边缘_第2张图片UE4提取场景模型边缘_第3张图片

(图片转载自BiliBili up主:@Opsader)

材质类型:选择后处理材质,并勾选Before Tonemapping ,这里涉及到TAA算法和Tonemap的Bug问题,而且对图像质量上也会有所提升

UE4提取场景模型边缘_第4张图片UE4提取场景模型边缘_第5张图片
 

核心节点:

输入SceneTexture,再改左侧ID为SceneDepth

UE4提取场景模型边缘_第6张图片

 

算法:

这里就要用到InvSize(InvertSize=1/Size)的输出值获取相邻像素做偏移

(下图为官方文档说明,这里的InvSize更加接近于屏幕空间上的1像素,如果直接加数值的话,会得到(1,1)变为(2,2),即可理解为屏幕空间内平铺两次)

UE4提取场景模型边缘_第7张图片

 

这边通过R&G取到横向和纵向的单位像素偏移,二维变量的值分别为

(1,0)、(-1,0)横向左右

(0,1)、(0,-1)纵向上下   做四组

UE4提取场景模型边缘_第8张图片

//这里的颜色信息都是黑白的,所以我们随便取一个通道就可以

BasicCode:

UE4提取场景模型边缘_第9张图片

 

效果看起来不是很理想,做在大场景里,场景深度的区分度可能达不到

UE4提取场景模型边缘_第10张图片

SceneDepth层信息这里我们看到,对于大场景和天空球来说,这里的引擎自带景深无法达到我们的需求,而且天空球上会有BUG

那我们改用CustomDepth试试得到结果看起来就还不错

UE4提取场景模型边缘_第11张图片

 

我修改了这两个部分的代码

  1. 把SceneDepth换成了CustomDepth,这样我们可以用引擎内容里的CustomDepth材质手动调节深度信息

      2、我把输出的差值去和一个合适的值比较,因为只知道边缘的差值是最大,具体是多少需要手动去测试,然后超出部分输出1,其他统一输出0,然后四个方向的都取最大值,这样输出的值就是边缘为1,其他部分为0的Mask了

你可能感兴趣的:(UE4,CG)