Bruneton 预计算大气渲染#2 —— SingleScattering


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

本篇主要讲解

  • 计算没有经过任何散射得到的地面辐照度

  • 单次散射的计算

Compute Direct Irradiance

这一步会用到大气渲染#1中计算得到的透射度材质,然后计算直接辐照,来自太阳的直接光经过大气传输到达地面的能量。

理论

对于间接地面辐照度,必须计算半球的积分。我们需要对半球上所有方向 ω 做积分,积分项是各方向上的乘积,即以下两项的乘积:

  • 经过 n 次反射后到达方向 ω 的辐照度,

  • 余弦因子,即 ωz

入口函数

#pragma kernel ComputeDirectIrradiance"]},"target":{"position":28,"lines":["            }

本篇主要讲解

  • 计算没有经过任何散射得到的地面辐照度

  • 单次散射的计算

Compute Direct Irradiance

这一步会用到大气渲染#1中计算得到的透射度材质,然后计算直接辐照,来自太阳的直接光经过大气传输到达地面的能量。

理论

对于间接地面辐照度,必须计算半球的积分。我们需要对半球上所有方向 ω 做积分,积分项是各方向上的乘积,即以下两项的乘积:

  • 本来应该是经过 n 次反射后到达方向 ω 的辐照度,但这里是计算在没有散射的情况下的直接辐照度,所以应该乘以 solar_irradiance * transmittance

  • 余弦因子,即 ωz

入口函数

#pragma kernel ComputeDirectIrradiance"]},"type":"CHANGE"},{"source":{"position":300,"lines":["}

每个分量都在 [0,1],并且已经过 GetTextureCoordFromUnitRange 调整到落在 texel 的中心。

真实的硬件只支持 3D 纹理,所以我们把第 1 维(ν)分成多层 slice 存放在一维纹理阵列里。查表时先:

  • tex_coord_x 把 u_nu 拉伸到 [0,NU ⁣− ⁣1] (u_代表是归一化坐标)

  • tex_x —— 当前要取的 slice 下标(整数部分)

  • lerp —— 插值因子(小数部分),用来在第 tex_x 层和 tex_x+1 层之间线性过渡,模拟 4D 的第 4 轴插值。

然后构造两次 3D 查表坐标并混合

”]},“target”:{“position”:300,“lines”:[”}

每个分量都在 [0,1],并且已经过 GetTextureCoordFromUnitRange 调整到落在 texel 的中心。

真实的硬件只支持 3D 纹理,所以我们把第 1 维(ν)分成多层 slice 存放在一维纹理阵列里。查表时先:

  • tex_coord_x 把 u_nu 拉伸到 [0,NU ⁣− ⁣1] (u_代表是归一化坐标)

  • tex_x —— 当前要取的 slice 下标(整数部分)

  • lerp —— 插值因子(小数部分),用来在第 tex_x 层和 tex_x+1 层之间线性过渡,模拟 4D 的第 4 轴插值。

然后构造两次 3D 查表坐标并混合

预告

下一篇会分享MultipleScattering的学习心得。

”]},“type”:“CHANGE”}]