Base-球谐光照与探针插值
Lightmap 把光照结果放在表面上,光照探针则在空间中的若干位置记录方向相关的信息,供移动物体使用。两者都可以来自离线烘焙,但它们不是同一种存储布局。
理解探针需要分清两次操作:在空间中插值得到当前位置的系数,再沿表面法线重建方向响应。球谐负责后一种表示,四面体插值和体纹理负责前一种位置变化。
1. 球谐是在球面上选一组基
Spherical Harmonics(球谐,SH)用一组球面基函数表示方向函数。保留到 l=2 时,共有 1+3+5=9 个实系数;RGB 各一套,共 27 个标量。
有些资料把它叫“三个 band”,有些叫“二阶 SH”,应直接写清 l 的范围与系数数目,避免“三阶”歧义。
低阶 SH 擅长表示缓慢变化的方向分布,不擅长锐利高光和硬阴影。漫反射余弦卷积本身会平滑方向变化,因此低阶近似常用于漫反射环境光。

原笔记配图:图中展示 l=0 到 l=3 的球谐基函数;正文 SH9 只使用前三行 l=0、1、2。正负瓣表示方向函数,而不是场景中的实际灯球。
2. 重建的是哪个量
抽象形式是 f(n)=Σ c_i*Y_i(n)。具体引擎可能把基函数常数、卷积系数等预先吸收到系数中,所以打包数组不能脱离生成方式解释。
对于已预卷积的漫反射辐照度系数,沿法线求值就得到该方向的辐照度近似,再按材质约定乘反照率等因子。不能求完 SH 后又随意乘一次 N·L,那会把另一种直接光模型重复加进来。
Unity 传统 Shader 常把 27 个标量打包到 7 个四维向量,以点积形式计算常数、线性和二次项。这是特定实现的存储安排,不是 SH 的数学定义。

原笔记配图:球谐基函数与 Shader 重建代码的对照。实现可能预先吸收基函数常数。

原笔记配图:Unity 传统 SH 系数的七个 float4 打包变量;这是实现布局,不是 SH 的数学定义。
3. 四面体插值解决位置变化
传统 Light Probe Group 的位置构成四面体划分。查询点落入某个四面体后,可由四个顶点的位置求出重心权重,再对各探针的系数加权:
1 | |
重建对系数是线性的,因此在同一法线下,先插值系数再求 SH,与先分别求值再按相同权重混合是等价的。工程上通常插系数,以便不同表面法线共享位置查询结果。

原笔记配图:原场景中的探针布点与间接光观察;探针位置和跨空间插值共同影响移动物体的光照。

原笔记配图:四面体剖分中的查询位置,在包围它的四个探针之间插值。

原笔记配图:四面体重心坐标的矩阵求解形式,第四个权重由 1 减去前三个得到。
4. 方向变化不等于空间变化
原笔记写“SH 不支持空间过渡”并不准确。SH 系数本身表示某一点的方向函数;空间过渡来自不同位置系数之间的插值,数学上完全可以做。
传统逐 Renderer 提交同一组系数,会使一个大物体所有位置使用相同环境,只随法线变化。问题出在采样与提交粒度,而不是 SH 天生禁止空间插值。

原笔记配图:原记录用于观察空间采样与物体关系的场景视图。
5. LPPV 与体积探针
Light Probe Proxy Volume(光照探针代理体积,LPPV)在体积中提供更细的空间采样,让大型物体不同部位获得不同的间接光。它的通道打包与 SH 阶数应按所用管线版本检查,不能把 SH9 的解释直接套在低阶体纹理上。
Unity 的 APV 又增加了自适应布点、砖块和流送等机制。它与传统探针共享部分表示思想,但不是换一个名字就能沿用所有旧接口;具体使用见现有 APV 文章。

原笔记配图:体纹理沿一个坐标轴分区存储系数的示意。具体打包方案由引擎与管线决定。

原笔记配图:LPPV 体纹理与 Inspector 的历史截图;分辨率、更新方式和渲染路径需要配套。

原笔记配图:在体积内布置采样点,为大物体不同部位提供空间变化。
6. 漏光为什么不能只靠多放探针解决
若四面体跨越墙壁,室内点可能插入室外亮探针。提高密度有时能改善,却不自动建立遮挡边界。布点应尊重墙面、门口和光照突变,必要时使用有效性、偏移、遮挡或场景分区策略。
低阶 SH 还可能出现振铃或负值。简单截零能避免负颜色,但会改变能量;应先检查烘焙、表示阶数和采样,再决定稳定化处理。
总结
探针系统把“位置”和“方向”分开压缩:空间结构决定在哪些记录之间插值,SH 决定如何按法线重建。区分这两层,才能解释大物体过渡、室内漏光与低阶近似的限制。