大气渲染学习笔记

大气散射学习笔记

学习教程基于https://zhuanlan.zhihu.com/p/548799663

类型:

外散射:因散射导致看不到的光线

内散射:观察到本不能观察到的光线

过程:

从真空到P点:

TCP=IPIC PIP=ICTCP

从P点到相机:

散射函数

瑞利散射:

IPA=IPS(λ,θ,h)TPA IPAPA

实际上在P到A点进行了无数个衰减,那么A点的光照实际上应该是每一个点的求和

ds IA=PABIPAds =PABICS(λ,θ,h)TCPTPAds =ISPABS(λ,θ,h)TCPTPAds

瑞利散射的定义

定义

I=I0S(λ,θ,h) S(λ,θ,h)=π2(n21)22ρN1λ41+cos2θ λn\Nρ(h)h 1ρ(h)h  S(λ,θ,h)=β(λ,h)γ(h)

ρ(h)=ehH

指数衰减:

设衰减系数为β

I1=I0(1β2) I2=I1(1β2)=I0(1β2)2 limn(1β2)n=eβ=exp{β} IP=ISexp{βCP}

瑞利散射是在三维空间进行的

β(λ,h)=02π0πS(λ,θ,h)sinθdθdϕ =02π0ππ2(n21)22ρ(h)N1λ4(1+cos2θ)sinθdθdϕ  =π2(n21)22ρ(h)N1λ402π0π(1+cos2θ)sinθdθdϕ =π2(n21)22ρ(h)N1λ416π3 β(λ,h)=8π3(n21)23ρ(h)N1λ4

瑞利相位函数推导:

γ(θ)=S(λ,θ,h)β(λ,h) =π2(n21)22ρN1λ41+cos2θ38π3(n21)2Nρ(h)λ4 =316π(1+cos2θ) ρ(h)=ehH=exp{hH} h=0,β(λ)=β(λ,0)=8π3(n21)231N1λ4

加入密度的影响

这个衰减并不完全是指数的,也会受到大气密度的影响

IP=ISexp{β(λ,h0)CQ}exp{β(λ,h1)QP} =ISexp{(β(λ,h0)+β(λ,h1))dS} dS

简化一下写法

IP=ISexp{QCPβ(λ,hQ)dS}

替换前文的简陋说法:

从C到P的透射率替换:

T(CP)=exp{QCPβ(λ,hQ)dS}

瑞利散射中衰减因子的替换

T(CP)=exp{QCP8π3(n21)23ρ(hQ)N1λ4dS}  T(CP)exp{8π3(n21)231N1λ4QCPρ(hQ)dS}

用于求和的量称为光学深度D(cp),这是shader里面要实际计算的东西,其余的都是乘法系数,只需计算一次

米氏散射

不会推导(

计算

散射方程

瑞利散射

瑞利散射系数定义:

βR(λ)=8π3(n21)23Neλ4nNeλβR(λ,h)=8π3(n21)23ρ(h)N1λ4

瑞利散射相位函数:

FR(θ)=34(1+cos2θ)

米氏散射

米氏散射定义

(更便宜的做法)

βM(λ,h)=8π3(n21)23ρ(h)N

米氏散射相位函数

HG(HenyeyGreenstein):γHG(θ)=14π1g21+g22gcosθg

密度函数

ρR,M(h)=exp(hHR,M)=ehHR,M

渲染解方程

plvhpλ线ISIS(p,v,l,λ)=II(λ)(ρR(h)FR(θ)βR(λ)4π+ρM(h)FM(θ)βM(λ)4π)

衰减函数

T(pa,pb,λ)=exp{iR,Mβie(λ)papbρR,M(h(p))dP}βe,βRe=βR

考虑了臭氧层对光的衰减过程(臭氧层不会散射光,只会衰减光)

在计算时只考虑臭氧层对光线的衰减

T(pa,pb,λ)=exp{iR,M,Oβie(λ)papbρR,M,O(h(p))dP}OρO=6e7ρR

单散射

ISR,M(1)(p0,v,l,λ)=II(λ)FR,M(θ)βR,M(λ)4πpapbρP,M(h(p))T(pc,p,λ)T(p,pa,λ)dP

考虑了散射和衰减的单散射公式

IS(1)=ISR(1)+ISM(1)

多重散射

嵌套多维积分可以获得高阶散射方程,但是太慢了

可以使用下面的函数来帮助实现多重散射

GR,M(k)(p,v,l,λ)=4πFR,M(θ)IR,M(k)(p,ω,l,λ)dω

该函数定义了一个到达某一点p的散射k阶的光量和在方向v上的散射

k阶的聚焦函数表示聚焦在p点的光,该店的光恰好经历了k个散射事件

使用k阶函数让我们对上面的单散射函数的最终公式变形得到多重 散射最终公式:

ISR,M(k)(p0,v,l,λ)=βR,M(λ)4πpapbGR,M(k1)(p,v,l,λ)ρR,M(h(p))T(p,pa,λ)dp

总光强就是把瑞利散射和米氏散射的结果相加,再计算k阶散射后到达观察者的所有光

需要做的就是把单次散射和更高阶散射的结果相加

IS=i=1kIS(i)

纹理存储

通过以下简化

  1. 地球可以被看成一个完美的球形
  2. 空气中的颗粒物密度只随高度变化和地理位置无关
  3. 由于地球与太阳之间的距离很远,所有到达大气层的光都可以视为平行光

将纹理从观察者位置(XYZ)、视图方向(XYZ)、光源方向(XYZ)组成的九个维度的查找表简化到四个自由度:高度、日天顶角、视天顶角和日视方位角

其中日视方位角影响地球对大气的阴影,这种现象由于多次散射几乎看不见了,并且还会被地形遮挡,因此去除日视方位角。于是需要对瑞利散射相位函数进行调整,不然会在太阳的米氏散射上有块状阴影,解决方法是将相位函数的评估推迟到fragment shader上

纹理化

为了能在3d纹理中回去到值,需要将三个参数转化到[0,1]的范围中

h[0,Hatm],θv[0,π],θs[0,π]uh[0,1],uv[0,1],us[0,1]

转化函数最直接的实现是使用线性参数化,但是可以通过线性参数化方程的改变来进一步提高精度

高度重映射

大气密度随海拔高度呈现指数下降,因此在低海拔地区应该有更多地参数化集中

uh=(hHatm)0.5

视天顶角重映射

在低海拔地区应更集中

uv={0.5(cvch1ch)0.2+0.5cv>ch0.5(chcv1ch)0.2cvchch=h(2REarth+h)REarth+h

日天顶角重映射

虽然太阳方向在白天不会发生剧烈的变化,但是我们不需要包含低于某个阈值的太阳角度,因为夜间几乎不存在来自太阳的非散射光

us=0.5(tan1(max(cs,0.1975)tan(1.26·1.1))1.1+(10.26))

posted @   Telluluu  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示