目前认为室内参数化光照模型主要分为两大类:
- 球面谐波
- 球面高斯
SH初探
目前球面高斯类的方法已经有EMlight开源了,球面高斯参数生成、网络训练已经打通。但是我还没有掌握球面谐波类的方法,球面谐波模型主要难点在于求取球谐基函数的系数(spherical harmonics coefficients)。
- 从使用SH光照模型并开源的代码入手,寻找球面谐波系数求取的代码:
- PointAR
代码开源,但是求球谐系数的代码直接写在了PointAR/datasets/pointar/preprocess/cuda/preprocess.cu里,且疑似根据点云来求 - Learning Scene Illumination by Pairwise Photos from Rear and Front Mobile Cameras
靠谷歌的C++库https://github.com/google/spherical-harmonics来求球谐系数。这个库应该是靠谱的,但是说明文档有点难看懂。 - Deep Lighting Environment Map Estimation from Spherical Panoramas
代码开源。SH实域系数求法 代码直接开源,可学习借鉴。使用的是LAVAL数据集。
- 直接谷歌”python spherical harmonics coefficients”等关键词,在github上也同时寻找,找到了3个python包和一个github代码:
- pyspharm
- pyshtools
- scipy.special.sph_harm
- https://github.com/lianera/SphericalHarmonicsLighting(C++)
阅读相关文档,最终pyshtools跑通。
借助pyshtools包,完成了将全景HDR图映射到球谐基上,获取低频部分的球谐系数,并从球谐系数重建出全景HDR、LDR图的代码。
系数求取和图像复原实验
下面展示一些全景图及其通过5阶球谐系数(共36*3个参数)重建出的图像:
图1
图1-重建
图2
图2-重建
图2
图3-重建
图4
图4-重建
可以看出5阶球谐系数能反映全景图的低频光照信息,成分上接近环境光。但是无法表示昏暗环境下的光源强度,这是SH光照模型的弱点。
Garon在其文章Fast Spatially-Varying Indoor Lighting Estimation中也用的是5阶球谐系数,他测试了3阶到8阶的SH,认为5阶SH达到了效率和效果的平衡,最适合他的工作:
We chose order 5 after experimenting with orders ranging from 3 to 8, and empirically confirming that order 5 SH lighting gave us a practical trade-off between rendering time and visual quality (including shading and shadow softness).
其他论文中使用到的SH也基本是2阶(9 $\times$ 3)、3阶(16 $\times$ 3)的。
球谐基底不止一种
球谐函数是球面空间上一组相互正交的基底,将球面上的信息(例如全景光照贴图、地球大气图层)分解为球谐基的表示形式与傅里叶变换是一个意思:都是从时域(或空间域)到频域的变换。
基底只需要满足相互正交,所以基底不唯一。基底的不同定义方法,就是不同的normalization。
目前常用的球谐函数工具包都会提供很多种normalization。不同的normalization得到的球谐基底、系数是不同的,但是重建的图像都是相同的。例如,pyshtools 4.10在支持以下四种normalization:
是否包含Condon-Shortley phase也是基底的两种不同表示方式。Condon-Shortley phase其实就是基底中的一个$(-1)^m$,如下图所示:
这是截取自另一个SH工具包SHTns 2.6.5说明文档的图。图里清晰列出了不同normalization下球谐基底$Y^m_l(\theta,\phi)$表示公式的区别,主要是$P^m_l(cos\theta)$前不同的系数。而Condon-Shortley phase是$P^m_l(cos\theta)$中的一项,可以选择加或不加。
pyshtools默认构建出’4pi’-normalized、不加Condon-Shortley phase的球谐基底,并按照此球谐基底求系数。这可能是因为pyshtools原本是为地理、大气、宇航等地球学科提供的工具包。
论文中使用的SH定义
但是,据我观察,球谐光照经典论文[^1]的一个python复现版本里使用的球谐基底应当是’ortho’-normalized,且添加了Condon-Shortley phase。理论上,观察这份代码里对$Y^m_l(\theta,\phi)$的定义:
1 |
|
再观察到其SH基函数关于m是正负交替的:
1 | def SH(l, m, theta, phi): |
至此,理论上可确定这份代码里的SH基函数是’ortho’-normalized,且添加了Condon-Shortley。
再做实验确定理论猜想。用pyshtools从一个hdr全景图中算出SH系数,设定为’ortho’-normalized,且添加Condon-Shortley。然后用这些系数重建图像。接着,用上述复现代码求SH系数,并复原图像。对比两份程序得到的系数和重建图像,基本一致。至此,可确定上述代码的SH基函数类型。
这份代码复现同时被另外一篇球谐光照论文使用[^2],因此我认为其专业性没有问题。
[1] 11 R. Ramamoorthi and P. Hanrahan, “An efficient representation for irradiance environment maps,” in Proceedings of the 28th annual conference on Computer graphics and interactive techniques - SIGGRAPH ’01, Not Known, 2001, pp. 497–500. doi: 10.1145/383259.383317.
[2] V. Gkitsas, N. Zioulis, F. Alvarez, D. Zarpalas, and P. Daras, “Deep Lighting Environment Map Estimation from Spherical Panoramas,” May 2020, doi: 10.48550/arXiv.2005.08000.