【GAMES104】 游戏中的天空渲染

一、大气拟合仿真

分析如何做出天空效果,直接的方法就是类似于Bling-Phong模型的拟合方法,这里给出了一个可以根据视角仰角\theta和与太阳夹角\gamma就可求得颜色的模型。这个模型的问题就是只能限制在地表,而且不具有实时性。

【GAMES104】 游戏中的天空渲染_第1张图片

 所以要做出更加真实的大气效果,就要从真实大气散射出发,这里给出了两种散射模型,瑞利散射(Rayleigh Scattering)和米氏散射(Mie Scattering) 。像空气分子这样的比光的波长还要小很多的颗粒引发的散射,我们称之为瑞利散射。发生瑞利散射时,光的波长越短,散射程度越强。由较大的颗粒引起的散射,称之为米氏散射。米氏散射的特征是所有波长的光均等发生散射。因此,各种波长的光混合在一起,使散射光和太阳光一样呈现白色。

【GAMES104】 游戏中的天空渲染_第2张图片 【GAMES104】 游戏中的天空渲染_第3张图片

 要真正做到拟合就要考虑到多种散射模型的融合,当然要做到这样就需要大量的计算,所以这就引出了著名的 Ray Marching 算法,它的核心思想就是,沿着视线,每过一段距离计算一次单一散射(Single-Scattering),之后将这些结果叠加。通常这些计算得到的数据运用LUT的方式进行存储。

【GAMES104】 游戏中的天空渲染_第4张图片

 二、实时大气渲染

上面说到在计算Ray Marching的时候要用到LUT的方式,那么存储的具体分为两个部分,一个部分是通透度(transmittance),表示可以看到的百分比;另一个部分就是散射度(Scattering)。为了预计算这两个部分,这里引出了Precomputed Atmosphere Scattering算法。

在计算通透度的时候,需要两个参数,天顶与实现夹角\theta和海拔高度h,当我们要计算从视点X_v到观测点X_m,只需要将视点到大气层顶的值除以观测点到大气层顶的值相除即可。

【GAMES104】 游戏中的天空渲染_第5张图片

在计算散射的时候,我们需要四个参数,天顶与实现夹角\theta、海拔高度h、天顶与太阳夹角\eta、视线与太阳夹角\phi,这样我们可以得到一个四维表,这样我们就可以把Single-Scattering求了出来。

【GAMES104】 游戏中的天空渲染_第6张图片

 之后我们就可以用Ray Marching的方法将多次单一散射混合,最终获得Multi-Scatter LUT。这个算法的问题就是,需要大量的预计算并且在低阶的设备上不能进行,并且不能灵活的改变散射系数来达到不同的效果,在实时运行的过程中我们需要将LUT进行降采样来提高采样的效率。

这里又提到一个更先进的解决方法,首先做了一个大胆的假设,假设大气中的散射都是同样的,那么在这个假设下就得以得出散射就是一个百分比的衰减,我们计算一次到两次的散射就会的到一个百分比,更高次的散射就是这个百分比的一个级数,这样就能用最简单的方式得到Multi-Scatter LUT。对于四维表的存储方式的优化,它去掉了太阳位置和高度,直接建立一个与天顶角和360°的环角的二维表。

【GAMES104】 游戏中的天空渲染_第7张图片 【GAMES104】 游戏中的天空渲染_第8张图片

 进一步,为了加上大气中透明度的积分,就直接积分过去,根据相机的距离产生3D LUT。虽然这种方法不符合物理上的认知,但是他实际上是符合人类的认知,最大的优点就是运用灵活。

【GAMES104】 游戏中的天空渲染_第9张图片

 三、云的渲染

 现在制作云运用的是 Volumetric Cloud Modeling 的方法,这种方式做出的云是实时渲染的,是能够实时变化的。第一步就是先获得一份Weather Texture,他是由两部分组成,一个是云在空间上的分布,另一个表示云的厚度,这样基本就能获得一个体积云。第二步就是用各种低频Noise进行腐蚀,再用高频增加云的细节。

【GAMES104】 游戏中的天空渲染_第10张图片

获得云后就要去渲染它,云不会生成面片,所以我们只能运用 Ray Marching 的方法进行渲染。在我们视线经过云的部分去计算其通透和散射。

 【GAMES104】 游戏中的天空渲染_第11张图片

你可能感兴趣的:(games104,游戏,游戏引擎)