Bruneton 预计算大气渲染#3 —— MultipleScattering


[{“source”:{“position”:200,“lines”:[”}

辐照度(Irradiance)E 定义为从半球内各方向入射到点 P 上、乘以入射角余弦并对立体角积分后的辐射度

cosθ=ωz​ 是方向 ω 与法线方向的夹角余弦。dω=sin⁡θ dθ dϕ 是立体角微元

注意这里第一个循环是 j<SAMPLE_COUNT / 2,是九十度,其实是上半球积分

GetScattering函数:

  • 一阶散射因为比较“简单”,把大气分子(Rayleigh)和气溶胶(Mie)分开存、分开算,再乘相位函数,精度高且贴图小。

  • 多阶散射因为数据量大,直接把“密度×相位”结果烘焙到一个 3D 贴图里,运行时直接查表。

"]},"target":{"position":200,"lines":["}

辐照度(Irradiance)E 定义为从半球内各方向入射到点 P 上、乘以入射角余弦并对立体角积分后的辐射度

cosθ=ωz​ 是方向 ω 与法线方向的夹角余弦。dω=sin⁡θ dθ dϕ 是立体角微元

注意这里第一个循环是 j<SAMPLE_COUNT / 2,是九十度,其实是上半球积分

GetScattering函数:

  • 一阶散射因为比较“简单”,把大气分子(Rayleigh)和气溶胶(Mie)分开存、分开算,再乘相位函数,精度高且贴图小。

  • 多阶散射因为数据量大,直接把“密度×相位”结果烘焙到一个 3D 贴图里,运行时直接查表。

"]},"type":"CHANGE"},{"source":{"position":228,"lines":["}

ComputeMultipleScattering

理论

这一步的核心是在视线方向 ω 上,对“沿射线每一点 q 处的散射贡献”做一次一维积分,这个散射贡献已经在ComputeScatteringDensity函数中计算完了。

入口函数

#pragma kernel ComputeMultipleScattering"]},"target":{"position":228,"lines":["}

ComputeMultipleScattering

理论

这一步的核心是在视线方向 ω 上,对“沿射线每一点 q 处的散射贡献”做一次一维积分,这个散射贡献已经在ComputeScatteringDensity函数中计算完了。

入口函数

#pragma kernel ComputeMultipleScattering"]},"type":"CHANGE"}]