← ALL ARTICLES
数学与采样4 MIN READ

球谐光照

全库目录221
本文目录8

环境图保存各个方向的入射光,而漫反射积分会削弱其中快速变化的角向细节。SH把这份球面函数投影到正交基底,让运行时用少量系数重建方向光照。角向细节来自保留的频带,空间可见性则需要探针系统另外处理。

球面函数表示

正交投影

球谐函数是一组定义在球面上的正交基函数。它和傅里叶级数的思路相似:用一组已知基函数及其系数近似原函数。

球面函数 f(ω)f(\omega) 可以展开为:

f(ω)≈∑l=0L∑m=−llclmYlm(ω)f(\omega)\approx\sum_{l=0}^{L}\sum_{m=-l}^{l}c_l^mY_l^m(\omega)
  • YlmY_l^m 是球谐基函数;
  • clmc_l^m 是当前函数在该基底上的系数;
  • ll 是频带阶数;
  • 截止到 LL 阶时共有 (L+1)2(L+1)^2 个系数。

低频光照与余弦卷积

低阶 SH 的基函数变化平滑。少量系数可以保存环境漫反射这种低频方向分布,但无法清楚表达太阳、高光和锐利阴影。

Lambert 漫反射本身会对入射光做余弦卷积,相当于削弱高频。因此 Light Probe 常用低阶 SH 保存间接漫反射。

系数投影

每个系数是原函数与基函数在球面上的投影:

clm=∫S2f(ω)Ylm(ω) dωc_l^m=\int_{S^2}f(\omega)Y_l^m(\omega)\,d\omega

这个积分可以离线计算,也可以用离散方向采样近似。运行时在当前法线方向计算基函数,再与系数做点积,就能重建近似光照。

系数求值

这是方向函数重建的伪代码。单位方向与基函数位于同一空间,系数顺序和归一化与投影端一致。

text
value = 0
for l = 0..L:
    for m = -l..l:
        value += coefficients[l,m] * RealSH(l,m,direction)
return value

入射辐亮度系数与已卷积余弦核的辐照度系数有不同语义。截止l=2时为3个频带、9个系数;应用余弦卷积按band缩放,漫反射出射还要乘反照率并除以π。

九项实基与光照求值

投影和求值必须使用同一套轴向、符号和排列。本页用单位方向(x,y,z),按00、1−1、10、11、2−2、2−1、20、21、22排列。前三阶实基为:

Y=(a,by,bz,bx,cxy,cyz,d(3z2−1),cxz,e(x2−y2))Y=(a,by,bz,bx,cxy,cyz,d(3z^2-1),cxz,e(x^2-y^2))

其中a=1/(4π)a=\sqrt{1/(4\pi)}、b=3/(4π)b=\sqrt{3/(4\pi)}、c=15/(4π)c=\sqrt{15/(4\pi)}、d=5/(16π)d=\sqrt{5/(16\pi)}、e=15/(16π)e=\sqrt{15/(16\pi)}。RGB环境对每个颜色通道分别投影,因此保存九个RGB系数。

离散环境图上的一项累加为c[k] += radiance * Y[k] * solidAngle。这里的solidAngle是该纹素覆盖的立体角;经纬图极点附近的纹素面积更小,不能按所有纹素等权求和。用均匀球面随机方向时,则用4π/N作为每个样本的积分权重。

如果保存的是入射辐亮度系数,求漫反射辐照度时分别把零、一、二阶乘以π、2π/3、π/4。这一步把余弦核的卷积放到系数上;若烘焙端已经完成卷积,运行时直接求值,重复乘一次会改变能量。最后的Lambert出射辐亮度是albedo * irradiance / π。

常量环境L=2只有c00=2√(4π),任意法线的辐照度都应为2π。再令L(ω)=1+ωz,解析结果为E(n)=π+(2π/3)nz,它能检查一阶方向与符号。高阶截断可能产生负值;直接截零会改变能量,只适合作为已说明的显示修正,不能当成投影本身。

经纬图的积分权重

经纬图以方位角phi和极角theta定位方向。宽W、高H时,一个纹素横向角宽为Δphi=2π/W,纵向边界为theta0=π*j/H、theta1=π*(j+1)/H。球面积分的面积元为sin(theta)dtheta dphi,因此该纹素的精确角面积为Δphi*(cos(theta0)−cos(theta1))。

W=4、H=4时,第一行每纹素约0.4601 sr,第二行约1.1107 sr;对称的另两行相同,总和为4π。把各纹素等权处理会给极区过多权重,方向光在环境图顶部与中部会得到不同能量。每格中心的辐亮度乘该立体角仍是对格内变化的近似,增加分辨率可以检查误差是否收敛。

验证方法

常量环境只保留零阶项,球面任意方向应重建相同值。使用单方向高亮检查方向、符号和振铃,再与数值半球积分比较。探针空间插值见独立专篇,SH系数自身不编码墙体可见性。

本页可运行CPU模型见 math_models.py,解析回归见 test_math.py。运行 python 知识库/examples/revision/test_math.py 检查常量与线性方向环境;未验证引擎探针格式、GPU执行或真实环境图误差。

相关主题

参考资料

  • Ramamoorthi与Hanrahan,环境图球谐投影参考实现,updatecoeffs的九项实基与tomatrix的辐照度重建;2026-10-22核读。
  • Peter-Pike Sloan, Stupid Spherical Harmonics Tricks.
  • Ravi Ramamoorthi and Pat Hanrahan, An Efficient Representation for Irradiance Environment Maps.