GAMES104 06.游戏中地形大气和云的渲染(下)
大气散射理论
Analytic Atmosphere Appearance Modeling
公式有两个参数:向上看的方向与天顶的夹角θ,向上看的方向与太阳的夹角γ
优点:计算简单高效
缺点:局限于地面视角,不能模拟从空中看、参数不能自由修改
Participating Media
也就是空气中的气溶胶。
光线与 Participating Media
的交互包括
Absorption
吸收Out-scattering
散射Emission
发光In-scattering
附近的Participating Media
的Out-scattering
对打到自己
Volume Rendering Equation(VRE)
Scattering Types
Rayleigh Scattering(瑞利散射)
对于越短的波长(蓝光、紫光)散射得越厉害,长波长(红光)散射很少。
λ是波长,θ是光线和介质的夹角,h是海拔高度(用来表示空气密度)
大多用于计算天空颜色
Mie Scattering
- 有方向性,沿着光的方向会略强,不考虑波长的影响
- Mie散射一般表现雾和光晕
实时大气渲染
Ray Marching
现实中气体散射会影响场景中的光照,上图中山的背面被空气的散射照亮。为了解决这一问题,我们可以使用 Ray Matching
的方式处理。
Ray Marching
主要计算的内容包括光线沿路径的距离、与物体的交点、体积密度、光线的散射和遮蔽等
- 沿着射线,在固定步长下,一步一步地积分起来。
- 计算复杂,那么就空间换时间,预先计算,存在表中。
Precomputed Atmospheric Scattering(重要)
大气模拟主要看两个参数:transmittance通透度、scattering散射
- 存 在地球上的任意一个点,视线与天顶的夹角
- 存 现在所在的海拔高度
- transmittance LUT存的就是从这么一个点看向这个θ方向,直到大气层的边界处,这些大气的通透度
- scattering散射要用三个角度算
缺点:
multi-scattering很贵
手机端不好生成transmittance LUT
不好生成动态的切换效果,晴天变雨天
Production Friendly Quick Sky and Atmosphere Rendering
先大胆假设,散射在各项分布是同样的。
这些光入射到你的点上,再散射回来的话,就是一个百分比的衰减
(没听懂喵)
云的渲染
Volmentric Cloud Modeling
优点:全动态、形状多变、可以飘
缺点:效率低,运算昂贵
Weather Texture:随机的云的分布+云的厚度
Noise Functions
Perlin Noise:用一个多项式的时间
Worley Noise
Cloud Desity Model
Ray Marching
又是他😋
从屏幕射出一条ray
在hit到cloud之前使用big step
hit到cloud之后在云里面使用dense step(小一点的步长)
计算从太阳散射到云的radiance
tips:
评论区看到的大气密度拟合式 地球的大气层密度是随着高度大致呈指数下降的, 搜Barometric Density可以得到比较精确的拟合式. 这里贴上我与 @himisa 制作的提升GPU运算性能的拟合式:
1
2
3
4
5
6
7
8
9
float ApproxEarthDensity(float altitude)
{
const float c0 = +2.452059275959612e-01;
const float c1 = -1.021307723720660e-04;
const float c2 = -6.682324198067511e-09;
const float c3 = +1.421577941465463e-13;
const float c4 = -1.006813818672577e-18;
return exp2(c0 + altitude * (c1 + altitude * (c2 + altitude * (c3 + altitude * c4))));
}