大气渲染的要点是视线上的大气范围中的每一点的光照结果都会对最终的渲染结果有影响,通过数值积分的方式,求和计算视线上的所有点P的光照,来计算最终光照效果;
单次散射只考虑太阳光从大气外部进入,经过一次折射进入相机的部分;
基本概念
The Transmittance Function 透射函数
光在大气中传播会衰减损坏,这里用T(CP)表示透射率
- IC 太阳光在C点刚进入大气层时的光量,此前光量没有散射流失
- IP 视线上的一点P,光到达此处时的光量,从C到P的过程中有一部分光量散射出去了
- T(CP),透射函数,计算光从C到P点的透射率,即散射后还保留的比例
The Scattering Function
到达P点的光量中,只有一部分会散射到相机,记为S
- λ 波长
- θ 散射角
- h 高度,和大气密度有关
- T(PA) P到A处的散射率
- IPA 到达相机的光量
渲染方程
还需要考虑从P点传播到相机A点的损耗T(PA),最终在该P点的光照为:
不过这只是AB上一点P的计算,每一点P都需要考虑;
The Numerical Integration
通过数值积分的方式,即分段出有限数量的P点,求和计算最终光照结果
最终的代码框架大致如下,后面会介绍s , tcp, tpa各部分的实现,这里先对整体结构有个简单的理解
1 | |
Scattering 散射函数
光根据大气中粒子大小的不同,会发生不同的散射情况,当粒子大于光线波长时,会发生Mie散射,当粒子远小于光线波长时,就是Rayleigh散射的情况,先介绍Rayleigh
Rayleigh Scattering
- λ 是波长
- θ 是散射角
- h 高度
- n = 1.00029 ,空气折射率
- N = 2.504 · 10^25 ,标准大气的分子数密度
- p(h) 密度比,在海平面时为1,随高度指数降低
海平面Rayleigh散射系数
为了简化求和部分,波长和角度和位置是无关的,可以当做常量提取出来,所以需要分解该等式,因为是平行日光,角度相当于常量;
通过对角度做球面积分,该等式表示所有角度的散射系数总和
当h = 0,即在海平面时,p(h) = 1,即获得
对应代码如下
1 | |
shader中光照颜色以rgb表示,可以通过R G B颜色的波长分别计算出对应颜色的散射系数
1 | |
优化整合到一起
1 | |
在地球上,n N 还有波长都是固定值,所以可以直接给出计算值
1 | |
Rayleigh散射相位
另外一部分就是和角度相关的式子,表示该角度散射的权重
通过S/β获取
1 | |
大气密度比
没有简单的式子可以精确的描述,可以使用指数函数来近似
H是尺寸高度,对于地球,通常是8500
1 | |
衰减系数 T(PA)
C到P上的每一点都会散射损失一部分能量,比例是β(λ, h),在一点处单次发生:
在CP到每一点上都会散射,每一点的透射率相同时,总散射为
不同时,透射率和大气密度即高度有关,因为每一个点的p(h)都不同,这需要积分计算,该积分结果记为光学距离 D(CP)
D(CP)同样通过数值积分计算,需要对p(h)部分积分
并且,P到A点也会有透射损失:
shader求和时需要求D
D(PA)直接在外层循环中计算
1 | |
D(CP)需要额外一层循环计算
1 | |
Mie Scattering
系数
相位
Cornette
1 | |
还有一些其他的相位公式
Heneye-Greenstein
Shlick,近似计算,效率更高
Shader实现
半透明 Additeve
1 | |
射线计算
需要求取A点和B点的位置,通过勾股定理可得
- O positionWS
- D viewDirWS
- R 大气半径 材质属性
- C centerWS
1 | |
宇宙中的星球大气
基于物理的渲染,参数需要使用物理正确的参数,对于星球来说,数值一般都非常大,星球模型不可能按照正确的参数1比1大小制作
一个方法是等比的缩小各项物理参数,例如地球模型半径为6.371m时,对比真实的地球半径6371000,散射系数应β * 1000000,高度H / 1000000
另一个方法是,使用物理正确的参数,对坐标位置等数据根据比例转化,计算出rayStartWS,_SphereRadius(1.0)是模型的半径,_PlanetRadius(6371000)是地球半径
1 | |
Mie和Rayleigh整合
需要做的是在循环计算Rayleigh时,同时计算Mie相关数据,在最后把二者的结果相加即可
D(CP)的部分
1 | |
S和D(PA)的部分
1 | |
相关参数值
参考资料
https://www.alanzucconi.com/2017/10/10/shader-atmospheric-sphere/
https://zhuanlan.zhihu.com/p/36498679