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”}]