我的专栏目录:
小IVan:专题概述及目录目前业内流行有两种体积云模拟的方式,模型+特殊shader法,RayMarching法。我前两篇文章已经对它们都做了介绍。当然还有些比较非主流的,比如粒子云法,点云法。这篇将作为体积云天空模拟部分的终篇,如果有一些更好的方法,我会更新这三篇文章。前面两篇介绍了它的原理。这里将记录Ray Marching法的完整具体实现方法。
虚幻4渲染编程(环境模拟篇)【第一卷:体积云天空模拟(1)---层云】
虚幻4渲染编程(环境模拟篇)【第二卷:体积云天空模拟(2)---3D体纹理低云】
下面是使用ray marching的办法构造天空。第一步是构造出一个体积场。我使用3D Value Noise
https://www.zhihu.com/video/1048682116862308352下面是我的Noise生成函数的代码
分形部分的代码
raymarching部分的代码如下:
这部分逻辑非常简单,从视口方向发射射线,每0.01单位的距离采样一次,并且把采样结果累加起来。因为我们的摄像机是世界空间的,而noise使用的是另一个空间的(这里把它叫作Noise Space吧),所以我们需要对其进行尺寸缩放转换。所以我乘了一个0.001的缩放值。
现在得到了一个体积场,但是这个体积场还离我需要的云的效果还很远。云除了有一定的形状结构外,还要相对于世界的高度等。
用目前这种积分方式是渲染不出云海的
因为迭代次数有限,根本不可能渲染到很远的地方,于是我改进了一下积分的步长算法,让步长不是等距的。
curpos += rd * exp(0.01 * i) * stepsize;
可以看到算法改进前后的差别
(等距)
(非等距)