当前位置:   article > 正文

unity大气散射

unity大气散射

大气散射效果对游戏画质提升来说巨大,本文主要从代码层面讲解下大气散射

单次散射

路径 AB 观察大气,并且求解 B 点的大气颜色,光线在大气中只发生一次散射,散射点为 P

阳光进入大气层CP开始衰减,在P点发生散射,然后PA衰减进入A点相机

I_{CP}=\boxed{I_P}{S(\lambda,\theta,h)} {T(CP)}

I_{PA}=\boxed{I_P}{S(\lambda,\theta,h)} {T(PA)}

T表示衰减系数 表示某段路径上光照的衰减程度

S表示散射系数 表示有多少光散射的角度为θ,λ为波长,h

实际上在路径 AB(也可能是斜的一条射线) 上有无数个 P 点,因此最终求解是对 AB 路径上每一个点的光照贡献进行累加 (求积分,不同高度不同密度)

\int_{A}^{B}I_{s} {T({CP})}{S(\lambda,\theta,h)} {T(PA)}ds

散射类型分2种

Rayleigh Scattering

大小远小于光线波长的粒子,由于粒子比波长还要小很多,所以光的波长也会影响散射程度

Mie Scattering

大小远大于光线波长的粒子,由于光的波长相较于这些粒子大小来说是可以忽略的,所以认为Mie Scattering和光线波长无关,Mie Scattering是太阳周围光晕的主要成因

散射方程

{S(\lambda,\theta,h)} = \frac{\pi^2(n^2-1)^2}{2}\frac{​{\rho(h)}}{N}\frac{1}{\lambda^4}(1+cos\theta^2)

λ光的波长(R680 G550 B440nm),θ散射角度,h高度,n空气的折射率,N一个常数表示大气厚度,大气密度ρ(h)密度比,在海平面为1,随高度呈指数下降

散射方程主要分为,1散射系数,2相位函数,3大气密度比

1 散射系数

{S(\lambda,h)} = \frac{8\pi^2(n^2-1)^2}{3}\frac{​{\rho(h)}}{N}\frac{1}{\lambda^4}

{S(\lambda,0)} = \frac{8\pi^2(n^2-1)^2}{3}\frac{​{1}}{N}\frac{1}{\lambda^4}

在海平面上,是一个常数

Rayleigh 0.005802f, 0.013558f, 0.033100f

Mie 来说 0.003996f, 0.003996f, 0.003996f

2 相位函数

{P(\theta)} = \frac{3}{16\pi}(1+cos\theta^2)

3 大气密度比

{\rho(h)} = exp(-\frac{h}{H})

Rayleigh 来说,H= 8500米

Mie 来说,H = 1200米

颜色来表示Rayleigh的散射

Absorption

除了发生散射,大气中还有臭氧和甲烷吸收

臭氧(O3)臭氧主要吸收短波紫外线

甲烷(CH4)甲烷是一种吸收红外光而反射蓝光的气体

Ragleigh没有吸收

用颜色来表示下Absorption

公式表

伪代码

  1. Function Transmittance(float3 A, float3 B)
  2. {
  3. float SAMPLE=64//采样次数
  4. float distance=length(A,B)
  5. float3 dir=B-A
  6. float ds=distance/SAMPLE
  7. float3 p = A + (dir * ds) * 0.5;
  8. float3 result=0
  9. //算积分
  10. for(int i=0; i<SAMPLE; i++)
  11. {
  12. float h = length(p)
  13. float3 extinctionMie = MieExtinction(h);
  14. float3 extinctionRay = RayleighCoefficient(h)
  15. float3 extinctionOzo = OzoneAbsorption(h)
  16. result += (extinctionMie + extinctionRay + extinctionOzo)*ds
  17. }
  18. return exp(-result)
  19. }
  20. float3 eyePos
  21. float3 viewDir
  22. float3 lightDir
  23. float3 P = eyePos + (viewDir * ds) * 0.5
  24. float cos⁡
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/225072
    推荐阅读
    相关标签