欢迎光临散文网 会员登陆 & 注册

UE4.25 volume texture插件包制作静态云效果

2020-08-01 23:56 作者:哇哇哇哇哦  | 我要投稿

前言

    六月进公司时,导师跟我提了后面的项目可能要用到云的效果,让我去研究一下ue4.25的volumetrics插件带的包里面的云效果,最好是能从理解原理开始一步步去搭建,给了我一篇文章:https://80.lv/articles/working-on-volumetric-clouds-in-ue4/

搭建

    我照着文章及文章里写到的几篇文章,尝试把raymarch的机制搭建了起来

整个效果涉及到的内容

    主要是通过两个custom material expression里面的代码和各种变量的配合来实现的

    按照文章提示写的Ray March Cube Setup部分的代码

Ray March Cube Setup部分的代码

    要注意的是文章中的版本是UE4.23,里面获取属性的表达式在新版本里有了一点点的改变如Primitive.WorldToLocal要换成GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal,即Primitive.换成GetPrimitiveData(Parameters.PrimitiveId).

    UE4.25插件中带的材质中的Ray March Cube Setup部分的代码,和文章涉及到的不同点主要是localscenedepth部分的处理不同

UE4.25插件中带的材质中的Ray March Cube Setup部分的代码

    Density Raymarch的代码:

Density Raymarch的代码

    基本上到这里把上面的代码无误地写好且创建好其中需要的各种节点之后,就能看到云的效果了

材质节点图

问题出现

    但是实际的情况是文章中提到的算法是不太完美的,在相当多的情况下是不理想的,如下面的图,体积云的位置实际上是凌空的(图右下角示),但是却能被其他mesh遮挡或隔断

体积云显示有误

    经过排查,得知这是maxstep数值导致的,而maxstep是前面的ray march cube setup代码块里计算return的,所以尝试不经过ray march cube setup的计算来获得maxstep,替换成直接参数数值的输入

    这样修改之后,体积云不会再被遮挡了,因为它直接位于画面的渲染最上层了

    所以无疑是需要通过ray march cube setup代码块的计算来输出maxstep才是稳妥的,可行的思路应该是修改ray march cube setup代码块中的某个变量的值

    到了现在这里,需要解决的问题是,体积云的遮挡关系在一定情况下不正确、不存在遮挡的情况下离的距离远了,体积云会变得消失一部分不可见

解决方案

    在研究(秃头)了两天将ray march cube setup中的各种变量的值调整之后,最后找到了着力点,将localscenedepth这一个变量的数值调大,Ray March Cube Setup中的代码是将localscenedepth除去两倍的localobjectboundmax和物体的x轴大小的积,即需要将两倍调成一倍,这样就可以实现在更远的地方也能继续看到体积

    而当想直接(白嫖)官方已经提供好的插件内容包里面的材质,则需要将Ray March Cube Setup中的代码depthpos /=256;改成depthpos/64;(经不具普适性的调试得出改成64可以达到需要的效果)

    然而到了这里,体积云是多远都能够看到而不会消失了,但也导致了另一个问题的产生,遮挡关系,由于ray march cube setup计算时是根据localscenedepth的,强行改变它的数值必然导致最后的maxstep无法处理好遮挡关系,所以最后只能借助ue材质本身的一些机制来挽救,例如深度检测(不知为什么文章上提到这个深度检测要disable,跟着做时把它disable了)

默认是没有勾选的,要是是跟着文章做的,就需要取消勾选

    补充:插件内容包里材质灯光阴影计算的灯光方向是一个需要手动输入向量的参数,需要自己改成SkyAtmosphereLightDirection

    

效果

    直接替换贴图就可使用

    至此,体积云的效果算是基本达到了想要的效果了


UE4.25 volume texture插件包制作静态云效果的评论 (共 条)

分享到微博请遵守国家法律