UP | HOME

AtmosphericScattering

Table of Contents

AtmosphericScattering note.

<!– more –>

Basic Knowledge

Volumetric Ligth Scattering Basic Knowledge

大气分层结构图:
atmosphere-layers.jpg

海拔高度和大气密度,大气压强的关系如下图:
air-density-altitude.jpg

Unity Procedural Skybox

AtmosphericScattering

Volumetric Atmospheric Scattering

Volumetric Single Scattering

单个光子射线可以被反射很多次。这意味着光到达摄像机所经过的路径可能会非常复杂。使用 raytracing 的方式来渲染半透明材质,需要模拟多个独立的光线路径,对于实时渲染来说,这样的计算消耗太昂贵了。本系列教程中使用的技术被称为 single scattering,其只考虑光射线单次散射事件。

渲染真实感天空的关键是,模拟光线经过星球的大气层所发生的事情。下图展示了一个摄像机,视线穿过了星球的大气层。渲染的基本理念是计算光从 B 传播到 A 的过程中,其如何被散射所影响。也就是说,需要计算光线传播到摄像机过程中,外散射和内散射的贡献。
依据我们的经验,外散射会导致光的衰减。在任意一点 P 处的光能量都有一定概率被反射到偏离摄像机的方向。
scattering_05.png

为了正确计算在任意 P 点,有多少外散射发生,首先我们需要知道起初在 P 点有多少光能量。假设只有一个恒星(太阳)照亮星球,P点处接收到的所有光都来自太阳。这些光能量中的一部分会被内散射,即被偶然地反射到摄像机。
scattering_06a.png
考虑上面两步(从 P 到 A 外散射后剩余的部分 和 在 P 点内散射到摄像机方向增加的部分)已经足够近似观察到的大气散射现象了。但是,计算起初在 P 的光能量是比较复杂的,光线经过大气从 C 到达 P,其本身也受外散射。
scattering_07.png

2008 Precomputed Atmospheric Scattering

Atmospheric Models

渲染大气光照依赖于两个方面:一个是局部介质属性的物理模型,另一个是对到达观察者眼睛的全局照明的模拟。这包括与地面的交互,地面可以被建模为一个 Lambertian 表面,其为一个高度场,其反射率为α(x,λ),法线为 n(x)。

Physical model

在 CG 中常用的物理模型是一个晴空万里的模型。模型基于两种成分,空气分子和气溶胶颗粒。在 Rg=6360km (地球半径 6371km)和 Rt=6420km 之间薄球面层中,这些分子和颗粒的密度会递减。

在每一点上,被散射到远离入射方向θ度的光的比例,由散射系数βs 和相位函数 P 的乘积给出。βs 取决于颗粒密度,P描述了角度的相关性。
对于空气分子,由 Rayleigh 理论可给出βs 和 P,空气分子几乎不会吸收入射光,消光系数(extinction coefficient) βe = βs
rayleigh-theory.jpg
和空气分子不同,气溶胶会吸收一部分入射光。吸收部分由 βa 表示,消光系数 βe = βs + βa。
mie-theory.jpg
随着海拔变化,折射率的变化会导致光线有小的偏折(小于 2 度)。简单起见,我们直接忽略该影响。

Rendering equation

这里我们将回顾参与介质的渲染方程,将其应用于大气。下图是渲染方程:
atmosphere-rendering-equation.jpg
下图是渲染方程相关概念的图示:
atmosphere-rendering-equation-01.jpg

Previous rendering methods

上面公式 8 非常复杂。在计算机图形学中有很多的简化假设用于简化计算来求出近似解。大多数实时方法都会忽略多次散射。这样的话,公式 8 就可以简化为 L = L0 + R[L0] + S[L0]。但是,S[L0]求解起来也很复杂。一些作者提出了以理想化为代价的解析求解方案:具有恒定大气密度的平坦地球[HP02],或没有米氏散射[REK∗04]。平坦地球假设限制只能在地面进行观察。否则,S[L0]通常是通过数值积分来计算的[NSTN93],可以通过低采样来实时进行[O'N05]。一个值得注意的例外是[SFE07],他们依赖于这个积分的预计算。然而,为了减少参数的数量,他们只考虑了视角和太阳天顶角,而忽略了视角和太阳方向之间的角度。因此,他们不能再现大气层内的地球阴影。

如上所述,忽略多重散射对白天来说是可以接受的,但对黄昏来说就不行了[HMS05]。这是因为太阳光在白天穿过的大气层要比日落或日出时少得多。因此,一些作者提出了考虑多重散射的方法。[PSS99]用分析模型拟合了双重散射蒙特卡洛模拟的结果,但他们的模型只对地面的观测者有效。[NDKY96]和[HMS05]使用体积辐射度算法来计算多重散射,但他们的方法远非实时(每幅图像几分钟到几小时)。

在本文中,我们提出了一种新的方法来实时渲染天空和空中视角,从地面到太空的所有视角,同时考虑到多重散射。该方法受到[SFE07]的启发,并在多重散射的基础上进行了扩展,加入了之前被忽略的视线-太阳角 参数,对预计算表进行了更好的参数化,并对 Light Shafts 采用了新的方法。

Our Method

为了提高效率和真实性,我们的目标是尽可能地预先计算 L,只用最小的近似值。我们的解决方案是基于对零散射和单一散射的精确计算,并使用近似的 occlusion 效果来计算多重散射。事实上,我们为零散射和单散射考虑了地面形状的细节,以便得到正确的地面颜色、阴影和 light shafts。但我们用一个反射率恒定的完美球体来近似计算多重散射,以允许预计算。

Notations
在展示我们的方法之前,我们需要一些符号和辅助函数。对于一个完美球形地面,由于球的对称性,x和 v 可以简化为一个海拔和一个视线天顶角,以 x,v,s 为参数的函数(如 L 或 S[L])就可以简化为只需 4 个参数的函数(两个参数表示 x 和 v,两个参数表示 s)。另外,L 可以被表示为一系列线性算子 R 和 S,第 i 项对应于光被反射或散射 i 次。
01-notation.jpg

Zero and single scattering
在渲染中,我们精确计算 L0 和 R[L0]。为此,我们使用了一个阴影算法来计算太阳的遮挡,并且预计算透射比 T(其只依赖于两个参数, 见 Section 4)。S[L0]比较复杂,其是 x 和 x0 之间的积分,但是,由于 L0 中的遮挡项,对于在阴影中的所有点 y,该积分为空,这里我们假设阴影中的点在 xs 和 x0 之间(见 Figure 1,更一般的情况在 Section 5 讨论)。这样,积分就可以简化到照亮的线段[x, xs]上进行。并且,occlusion 可以被忽略,因为采用 xs 就是考虑了 occlusion 了。预计算 T 只需要 2 个参数,预计算 S[L0]需要 4 个参数。
01-single-scattering.jpg

Multiple scattering
如上所示,尽管有遮挡,L0 和 L1 还是可以准确计算出来。不幸的是,在其他项 L2+…=R[L∗]+S[L∗]中考虑遮挡的问题要困难得多。希望在这种情况下,occlusion 可以被近似计算。事实上,在白天,多重散射效应与单一散射相比是很小的,而在不被太阳直接照射的情况下,地面的贡献也很小。因此,我们通过对多重散射的贡献进行积分来近似 S[L∗]中的遮挡效应,而该多重散射(在 x 和 xs 之间)贡献是在没有遮挡的情况下计算的。这会产生正的和负的偏差(见图 1)。我们还对 R[L∗]中的遮挡效应进行了近似,其是由于地面的切平面而导致的水平半球的环境遮挡。
01-multi-scattering.jpg

Precomputations

01-precompute-1.jpg

Angular precision
S' 为 4D 表格,其尺寸会随分辨率增大快速增大。所以我们只能为 v 使用有限的角度分辨率。这带来了一个精度问题,然而这只限于具有很强前向散射的 Mie 散射。为了解决这个问题,我们把单次的 Mie 散射项与 S' 中的所有其他散射项分开,以便在运行时应用相函数。
01-precompute-2.jpg

参考资料

2009 Rendering Parametrizable Planetary Atmospheres with Multiple Scattering in Real-Time

参考资料

A Scalable and Production Ready Sky and Atmosphere Rendering Technique

参考资料

alan zucconi Totorials