返回
Featured image of post 体积雾

体积雾

效果图

基本思路

  1. 首先需要知道的是该案例的体积雾与体积云是在屏幕后处理的基础上实现的,也就是说,实际上云是没有实体对象的

  2. 我们需要知道,使用Voronoi噪声与Simple噪声搭配,我们就可以得到一张较为抽象的平面云图,这未我们后续的效果实现奠定了基础

  3. 从上一步我们可以得到一个2D的云,但只能垂直去看,如果将2D噪声转换成3D的呢?我们将会得到一个最简单的体积云。这一步我们使用ComputeShader来计算噪声纹理,ComputeShader是利用GPU计算但独立在渲染管线之外的计算程序,因为GPU适用于多线程进行大量的重复计算,所以性能上比CPU计算来的快。

  4. 接下来我们需要考虑如何在Shader中应用这个简单的体积云。首先我们要定义一个包围盒,由这个包围盒来确定我们想要出现云的范围与位置,将该包围盒的最小坐标与最大坐标传入Shader中进行云层定位计算,接下来我们需要深度纹理来确定云层与物体的关系。

  5. 当云的位置和范围都确定好后,我们要真正着手去计算云的表现关系了。通过第3步,我们可以从得到一张3D噪声纹理,那么我们要如何从纹理中获取云层厚度关系呢。这里使用的手法是使用步长采样计算,我们从视角发送射线,从进入云层包围盒开始,每隔一段距离,就采样一次3D纹理中该坐标点的颜色信息,直到超出包围盒。最后使用 exp函数 将采样的结果进行曲线采样,这样我们就能得到屏幕后处理下的云层厚度信息。也得到了一个简单的云层效果,但还没有光照细节。

  6. 那么光照如何计算呢。基本上和上一步做法相当,通过计算光源到摄像机向量穿透云层的步长,然后与一些光照衰减函数相乘来得到。

  7. 该体积云效果还有许多细节上的欠缺,且性能不是很理想。但实现了基本的体积云计算思路。

Licensed under CC BY-NC-SA 4.0
0