【cg】【球谐光照】球谐函数
前言
书接前文 【cg】【球谐光照】预备知识之拉普拉斯方程 。
本篇我们来继续研究球谐函数的解及其性质。上回书说到求解
拉普拉斯方程
的结果着落在了
伴随勒让德多项式
上,本文我们首先会先接着上文的结论讨论一下伴随勒让德多项式的一相特性,必最终解出球谐函数的具体表达式。然后接着类比傅立叶变换研究一下球谐函数的投影和重建过程。最后讨论球谐函数的两个重要性质,即
正交完备性
与
旋转不变性
。
本文需要用到的在上回书中提到的公式列举如下。
伴随勒让德多项式
上文中
便是
伴随勒让德方程
,它的解构成的
伴随勒让德多项式
,其解析式如下。
求解方法
我们在编写程序求解时一般不直接套用
这个公式,而是使用时间复杂度更低的递推关系来求出所有
取值内的
值。其递推关系如下。
对于任意固定的m值,我们都可以求出所有的l(
)时的P值。
勒让德多项式
当
时,伴随勒让德方程退化为勒让德方程。
其解也退化为勒让德多项式。
该多项式不包含导数的表达式如下。
我们可以通过这个表达式求出具体的多项式表达,下面列出前几项
其与伴随勒让德多项式之间的关系为
可以看出伴随勒让德多项式其实是勒让德多项式的m阶导。
正交性
伴随勒让德多项式有一个重要的性质是它满足正交性。
其中
意思是说任意相同两项之积在定义域内的积分结果为一个只与
相关的常数,任意不同两项之积在定义域内的积分结果为0。
这便是伴随勒让德多项式的正交性,这个性质相当重要。
球谐函数
球谐函数
[
4
]是上面拉普拉斯方程解的角度部分,即
。因为对于每一个确定的
,都有一个解Y,记为
。
由上面的结果
可得球谐函数的表达式如下。其中
为虚数单位,显然这是一个复数域的表达式。
其中
为
Condon–Shortley相位
,经常出现在物理学定义中,暂时可以忽略。
其中
为归一化因子,这个归一化与正交完备性有关。
正交完备性
由于
是满足正交性的,如公式
所示,所以我们只需要添加一个系数,就可以使球谐函数也满足正交性,且为正交完备(标准正交)的,即满足
其中
为一个立体角方向,它与一组
对应,即
。
所以为了满足正交完备性而即归一化后的球谐函数为
实数形式
我们需要将上述复数形式转换为实数形式进行应用。当
时,我们使用
的实部
,当
时,我们使用其虚部
,并调整规一化因子,可得其实数形式的表达式为
根据表达式
,我们尝试求出前三阶的所有的解,如下表所示。
由
,易得当
时直角坐标系下的所有解,如下所示。
对比ue4自带的球谐函数代码,可以看到与我们自己计算的结果是一致的。
// SHCommon.ush
FTwoBandSHVector SHBasisFunction(half3 InputVector)
FTwoBandSHVector Result;
// These are derived from simplifying SHBasisFunction in C++
Result.V.x = 0.282095f;
Result.V.y = -0.488603f * InputVector.y;
Result.V.z = 0.488603f * InputVector.z;
Result.V.w = -0.488603f * InputVector.x;
return Result;
FThreeBandSHVector SHBasisFunction3(half3 InputVector)
FThreeBandSHVector Result;
// These are derived from simplifying SHBasisFunction in C++
Result.V0.x = 0.282095f;
Result.V0.y = -0.488603f * InputVector.y;
Result.V0.z = 0.488603f * InputVector.z;
Result.V0.w = -0.488603f * InputVector.x;
half3 VectorSquared = InputVector * InputVector;
Result.V1.x = 1.092548f * InputVector.x * InputVector.y;
Result.V1.y = -1.092548f * InputVector.y * InputVector.z;