一、大气拟合仿真
分析如何做出天空效果,直接的方法就是类似于Bling-Phong模型的拟合方法,这里给出了一个可以根据视角仰角和与太阳夹角就可求得颜色的模型。这个模型的问题就是只能限制在地表,而且不具有实时性。
所以要做出更加真实的大气效果,就要从真实大气散射出发,这里给出了两种散射模型,瑞利散射(Rayleigh Scattering)和米氏散射(Mie Scattering) 。像空气分子这样的比光的波长还要小很多的颗粒引发的散射,我们称之为瑞利散射。发生瑞利散射时,光的波长越短,散射程度越强。由较大的颗粒引起的散射,称之为米氏散射。米氏散射的特征是所有波长的光均等发生散射。因此,各种波长的光混合在一起,使散射光和太阳光一样呈现白色。
要真正做到拟合就要考虑到多种散射模型的融合,当然要做到这样就需要大量的计算,所以这就引出了著名的 Ray Marching 算法,它的核心思想就是,沿着视线,每过一段距离计算一次单一散射(Single-Scattering),之后将这些结果叠加。通常这些计算得到的数据运用LUT的方式进行存储。
二、实时大气渲染
上面说到在计算Ray Marching的时候要用到LUT的方式,那么存储的具体分为两个部分,一个部分是通透度(transmittance),表示可以看到的百分比;另一个部分就是散射度(Scattering)。为了预计算这两个部分,这里引出了Precomputed Atmosphere Scattering算法。
在计算通透度的时候,需要两个参数,天顶与实现夹角和海拔高度,当我们要计算从视点到观测点,只需要将视点到大气层顶的值除以观测点到大气层顶的值相除即可。
在计算散射的时候,我们需要四个参数,天顶与实现夹角、海拔高度、天顶与太阳夹角、视线与太阳夹角,这样我们可以得到一个四维表,这样我们就可以把Single-Scattering求了出来。
之后我们就可以用Ray Marching的方法将多次单一散射混合,最终获得Multi-Scatter LUT。这个算法的问题就是,需要大量的预计算并且在低阶的设备上不能进行,并且不能灵活的改变散射系数来达到不同的效果,在实时运行的过程中我们需要将LUT进行降采样来提高采样的效率。
这里又提到一个更先进的解决方法,首先做了一个大胆的假设,假设大气中的散射都是同样的,那么在这个假设下就得以得出散射就是一个百分比的衰减,我们计算一次到两次的散射就会的到一个百分比,更高次的散射就是这个百分比的一个级数,这样就能用最简单的方式得到Multi-Scatter LUT。对于四维表的存储方式的优化,它去掉了太阳位置和高度,直接建立一个与天顶角和360°的环角的二维表。
进一步,为了加上大气中透明度的积分,就直接积分过去,根据相机的距离产生3D LUT。虽然这种方法不符合物理上的认知,但是他实际上是符合人类的认知,最大的优点就是运用灵活。
三、云的渲染
现在制作云运用的是 Volumetric Cloud Modeling 的方法,这种方式做出的云是实时渲染的,是能够实时变化的。第一步就是先获得一份Weather Texture,他是由两部分组成,一个是云在空间上的分布,另一个表示云的厚度,这样基本就能获得一个体积云。第二步就是用各种低频Noise进行腐蚀,再用高频增加云的细节。
获得云后就要去渲染它,云不会生成面片,所以我们只能运用 Ray Marching 的方法进行渲染。在我们视线经过云的部分去计算其通透和散射。