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

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

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

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

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

要注意的是文章中的版本是UE4.23,里面获取属性的表达式在新版本里有了一点点的改变如Primitive.WorldToLocal要换成GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal,即Primitive.换成GetPrimitiveData(Parameters.PrimitiveId).
UE4.25插件中带的材质中的Ray March Cube Setup部分的代码,和文章涉及到的不同点主要是localscenedepth部分的处理不同

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中的各种变量的值调整之后,最后找到了着力点,

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

效果

直接替换贴图就可使用

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