球谐函数

从傅立叶级数说起

在信号处理中常有用傅立叶变换把信号从时域转换到频域来进行分析和处理的做法,也就是将满足一定条件的周期函数$F(x)$,展开写成$F(x)=\sum_{-\infty}^{+\infty} a_k e^{jk(\frac{2\pi}{T})x}$,其中$a_k=\int_T F(x)e^{-jk(\frac{2\pi}{T})x}dx$,可以观察到,$a_k$是一个与原函数$F(x)$相关的积分式,而无论$F(x)$有没有解析式,我们既然得到了一个信号,那么它在任意$x_i$的函数值是可以得到的,因此可以通过数值积分来近似求解。

球谐函数

将定义在球面上的函数$F(\theta,\phi)$投影到以球谐函数为基的级数展开与此类似,只是定义域和基函数不一样。

$F(\theta,\phi)$在球面的展开式为:

$F(\theta,\phi)=\sum_{l=0}^{\infty}\sum_{m=-l}^{l}C_l^m Y_l^m(\theta,\phi)$

$C_l^m$是球谐系数,$Y_l^m$为球谐函数,$C_l^m$相当于傅立叶变换中的$a_k$,这个系数的求解也与$a_k$类似

$C_l^m=\int_S F(\theta,\phi)Y_l^m(\theta,\phi)d\omega$

同样是个积分式,也是可以通过蒙特卡洛方法来进行积分的近似数值计算。

$Y_l^m(\theta,\phi)$的解析式则比较复杂,这里就略过了)只要知道是定义在球面上的正交基集合,作用类似于$e^{-jk(\frac{2\pi}{T})x}$将函数展开为傅立叶级数,$l$值越大的球谐函数,包含的高频信息越多。

投影的意义

将一个可以得到数值解的函数$F(\theta,\phi)$投影的意义何在呢?我的理解是减少了存储数值解所需的空间,设想要存储来自天空的环境光,或是场景中某一点朝向任意方向的irradiance,若是存储为CubeMap,虽然可以保存比较高频的信息,但需要消耗大量的存储空间。而在不太需要高频信息的环境光和irradiance数值,在取$l=2$时就能得到不错的效果。在这些使用场景,就可以只存储基函数9x3channel,27个数值来重建光照信息。