UE4 关于CustomDepth的一些使用方法

上星期五有个VR项目的程序跟我提了个需求,他那个项目是个VR版的UE4射击游戏,想做个枪的射击瞄准准心,这个准心必须是个3D模型做的,有个核心技术问题要解决:就是它的材质必须保证永远保证显示在摄像机的最前面,如果是Unity的话这个好解决,改下shader的渲染顺序和关掉深度测试应该能解决了,但是UE4的材质蓝图节点还不是所有节点我都搞明白了的,第一天我按照渲染管线的工作原理先从深度测试方面找办法,在网上找到一篇董国政大神写关于用DisableDepthTest来实现透视效果的技术文章:https://blog.csdn.net/qq_36409711/article/details/76691192

UE4 关于CustomDepth的一些使用方法_第1张图片

采用了文章上的方法后,在项目场景里显示如下:UE4 关于CustomDepth的一些使用方法_第2张图片

这个cube的材质上就是按照上面链接里的文章提供的思路写出来的,刚一看这个cube穿插到地面后下半个cube也没有被地面遮挡住,显示在了摄像机的最前面,可是当鄙人把材质交给程序后,他捣鼓了一阵就发了一张截图过来:

UE4 关于CustomDepth的一些使用方法_第3张图片

可以看到,cube虽然没有被不透明物体遮挡,但是被半透明的物体(烟雾粒子)的材质给挡住了(其实是像素混合在一起了),这个问题还得借鉴Unity渲染管线的过程分析,如果两个物体深度测试都关掉了,或者两个物体材质选择的BlendMode都是Translucent,那么这两个透明物体的像素就会产生混合,出现上面截图里出现的现象。

后来我才想到,还得要从渲染顺序这方面着手想办法解决这个问题。而UE4的渲染顺序设置我暂时没找到在哪可以像UnityShaderLab那样方便设置,正好在youtube上找到了一个用PostProcessVolume的方法实现描边效果的视频:https://www.youtube.com/watch?v=rL7VUeZzRyQ

描边效果也是有显示在所有物体最前面的效果正好可以参考,这个办法关键点就是:CustomDepth。

首先创建一个材质,MaterialDomain选择PostProcess:

UE4 关于CustomDepth的一些使用方法_第4张图片

然后按照下图连好蓝图:

UE4 关于CustomDepth的一些使用方法_第5张图片

其实很简单就是通过CustomDepth来减去一个DepthOffset(深度偏移值),然后跟SceneDepth做条件判断,最后PostProcess获取的像素数据会跟cube要显示的颜色进行线性插值,最后效果:

可以看到,穿插到地面下的部分不会被地面遮挡住,半透明的烟雾粒子也没跟cube的像素混合在一起,可以说实现了显示在最前面的效果了。

当然,写完材质还得改一些设置:

Edti-->PrjectSettings-->Engine-->Rendering-->Postprocessing-->CustomDepth-StencilPass-->Enable

UE4 关于CustomDepth的一些使用方法_第6张图片

另外准心物体Deteils-->Rendering-->RenderCustomDepthPass也要打上勾:

最后场景中PostProcessVolume的Details-->RenderingFeatures-->PostProcessMaterials-->Array后面的+号增加一个材质后,把上面做好的材质赋上去(注意:选Asset reference):

UE4 关于CustomDepth的一些使用方法_第7张图片

UE4 关于CustomDepth的一些使用方法_第8张图片

大功告成!!最后程序那边 VR模式下测试了也是能正常工作的!!

UE4 关于CustomDepth的一些使用方法_第9张图片

最后总结一下:最终是利用CustomDepth通过偏移深度值(我这里偏移了10000,具体多少看具体场景),后来我把这个偏移量设置成公有变量可以自由调试

UE4 关于CustomDepth的一些使用方法_第10张图片

差不多可以像UnityShaderLab那样方便快捷的设置渲染顺序了!!

主要资源在我的GitHub项目上,有需要的可以去拿:https://github.com/zwbcshjlb/UE4_CustomDepth

你可能感兴趣的:(UE4)