球谐光照
全库目录221
本文目录8
环境图保存各个方向的入射光,而漫反射积分会削弱其中快速变化的角向细节。SH把这份球面函数投影到正交基底,让运行时用少量系数重建方向光照。角向细节来自保留的频带,空间可见性则需要探针系统另外处理。
球面函数表示
正交投影
球谐函数是一组定义在球面上的正交基函数。它和傅里叶级数的思路相似:用一组已知基函数及其系数近似原函数。
球面函数 可以展开为:
- 是球谐基函数;
- 是当前函数在该基底上的系数;
- 是频带阶数;
- 截止到 阶时共有 个系数。
低频光照与余弦卷积
低阶 SH 的基函数变化平滑。少量系数可以保存环境漫反射这种低频方向分布,但无法清楚表达太阳、高光和锐利阴影。
Lambert 漫反射本身会对入射光做余弦卷积,相当于削弱高频。因此 Light Probe 常用低阶 SH 保存间接漫反射。
系数投影
每个系数是原函数与基函数在球面上的投影:
这个积分可以离线计算,也可以用离散方向采样近似。运行时在当前法线方向计算基函数,再与系数做点积,就能重建近似光照。
系数求值
这是方向函数重建的伪代码。单位方向与基函数位于同一空间,系数顺序和归一化与投影端一致。
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排列。前三阶实基为:
其中、、、、。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.