赞
踩
大气散射效果对游戏画质提升来说巨大,本文主要从代码层面讲解下大气散射
路径 AB 观察大气,并且求解 B 点的大气颜色,光线在大气中只发生一次散射,散射点为 P
阳光进入大气层CP开始衰减,在P点发生散射,然后PA衰减进入A点相机
T表示衰减系数 表示某段路径上光照的衰减程度
S表示散射系数 表示有多少光散射的角度为θ,λ为波长,h
)
实际上在路径 AB(也可能是斜的一条射线) 上有无数个 P 点,因此最终求解是对 AB 路径上每一个点的光照贡献进行累加 (求积分,不同高度不同密度)
大小远小于光线波长的粒子,由于粒子比波长还要小很多,所以光的波长也会影响散射程度
大小远大于光线波长的粒子,由于光的波长相较于这些粒子大小来说是可以忽略的,所以认为Mie Scattering和光线波长无关,Mie Scattering是太阳周围光晕的主要成因
λ光的波长(R680 G550 B440nm),θ散射角度,h高度,n空气的折射率,N一个常数表示大气厚度,大气密度ρ(h)密度比,在海平面为1,随高度呈指数下降
散射方程主要分为,1散射系数,2相位函数,3大气密度比
在海平面上,是一个常数
Rayleigh 0.005802f, 0.013558f, 0.033100f
Mie 来说 0.003996f, 0.003996f, 0.003996f
Rayleigh 来说,H= 8500米
Mie 来说,H = 1200米
颜色来表示Rayleigh的散射
除了发生散射,大气中还有臭氧和甲烷吸收
臭氧(O3)臭氧主要吸收短波紫外线
甲烷(CH4)甲烷是一种吸收红外光而反射蓝光的气体
Ragleigh没有吸收
用颜色来表示下Absorption
公式表
伪代码
- Function Transmittance(float3 A, float3 B)
- {
- float SAMPLE=64//采样次数
- float distance=length(A,B)
- float3 dir=B-A
- float ds=distance/SAMPLE
- float3 p = A + (dir * ds) * 0.5;
- float3 result=0
- //算积分
- for(int i=0; i<SAMPLE; i++)
- {
- float h = length(p)
- float3 extinctionMie = MieExtinction(h);
- float3 extinctionRay = RayleighCoefficient(h)
- float3 extinctionOzo = OzoneAbsorption(h)
- result += (extinctionMie + extinctionRay + extinctionOzo)*ds
- }
- return exp(-result)
- }
- float3 eyePos
- float3 viewDir
- float3 lightDir
- float3 P = eyePos + (viewDir * ds) * 0.5
- float cos声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/225072推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。