
大气和天空
天空和云很能渲染气氛
大气
大气散射理论
影响变量:向上看的角度到天顶的夹角,一般是0-PI;向上看的夹角和太阳的夹角。
优点:计算迅速。
缺点:仅限在地面上观察;参数调整受限。
这种做法在手游中混混没问题,但是在3A质量中不太行。
空气体积中充满了各种分子;不同分子对于光子有不同的影响。
辐射传递方程:吸收→散射→自发光(火焰,闪电;游戏中不加也可以)→被其他气体分子散射的光照射。这里只是一倍方程,真实世界中是个梯度方程。
空气中有很多分子的时候有两个很关键的变量:在远处看到的东西有多少能透到眼睛的部分;光线经过空气中的散射,有多少能量能沿着光路能射到眼睛里。
影响大气的三个重要元素:日光;气体分子(波长普遍小于光的波长);气溶胶分子(波长一般接近日光的波长)。
波长很重要,很影响散射!
瑞利散射:空气中介质远小于光的波长时,光就几乎会四面八方均匀散射,越短的波长散射得越厉害。(蓝紫光波长短,红光波长长)
米氏散射:空气中介质远接近或大于光的波长时,光散射的方向性就会略强,对波长不敏感。
瑞利散射:散射分布两头大中间扁,蓝光反射度高。
λ:光的波长 ;
\theta:视线和光之间的夹角;
h:海拔高度,大气密度在海拔为0的时候浓度最大。
\frac {1}{λ^4} :光的波长越短的时候,散射的强度越高
为什么天是蓝的:红光波长最长,直射地球,蓝光则在大气中不停的反射;
傍晚的时候很多蓝光被反射到宇宙中了,不在大气中反弹,所以是红的,吸收线也会加剧这个红色。
米氏散射:形状奇怪
米氏散射同样和夹角、波长、海拔高度相关,全部变成一个常数。
g:当g=0的时候,米氏散射会退化成和瑞利散射一样的花生形状,g>1的时候就会越来越奇怪;g<0相当于光向光相反的反向反射的更多。
大气中的吸收
臭氧和甲烷都是在高空中的,在游戏引擎中我们都把他均匀分布在地上空间中。
单词散射已经非常复杂,各种分子和气溶胶互相散射然后计算通透度积分等;
现实世界中的更接近为多次散射,哪怕各种分子和气溶胶不在视线内,但是它的散射依然会照亮进入眼中路径上的各个点,各个点沿着视线路径方向又有一个散射,这是大气现象最为复杂的点。
这与GI不同,GI是各种面的散射,多次散射是光在空间的扩散。
沿着视线梯步计算积分,同样是预计算好用速查表。
实时大气渲染
大气中的散射现象最重要的两个点:通透度;散射度
利用参数化的方法得到三个量:
- 视线观看的夹角;
- 太阳的夹角;
- 视线方向和太阳的夹角。 最后再采样高度,就能创建一个四维表。
一个通透度的图和单词散射做积分就能做一次的大气散射图,这样以此就能重新计算通透度做二次三次。游戏中通常中3、4次基本就够了,拼合起来就能得到多次的大气散射。
预计算大气散射的挑战与困难:
预计算花费很大,在四维表上速查再做插值非常困难,迭代非常困难(晴天→雨天);难以在低端设备上使用。
UE5中使用的更优秀的大气思路
核心思路:大气中的散射非常低频,所以大胆假设空气中的散射在空气中的各项分布分布是相同的。
如果四面八方入射光是均匀的,那么反射回来的光就是一个线性的百分比的衰减。
以此再运用上面计算计算多次散射的思路时去求多次大气散射的积分,那么就会发现N次散射的梯度是一个等差均匀的,叠加在一起时就相当于算出了无数次散射的值,不需要每次都做路径积分了。
- 假设位置不变,消除高度的影响;
- 假设每一帧都算,那么对高度的采样就没意义,干掉h维度;
- 太阳每帧都算,那么假设太阳位置固定,干掉太阳的位置。 再把天顶角和太阳的360度环角的反射全部计算完。
最后根据摄像机距离的远近算通透度的积分。
优点:计算非常高效
能计算很多动态的效果
云的渲染
曾经云的表达
层云、积云+高空层云、高空积云+高空卷层云+高空卷积云
现今云的表达
优点:全动态;大规模;支持动态天气、动态体积光和阴影。
缺点:计算昂贵
移动:平移;变化:noise