尝试实现蒙特卡洛路径跟踪时,我在光采样过程中遇到了障碍。
通常,程序如下:
- 追踪从相机(或前一点)开始的光线,直到到达表面点。
- 到达表面点后,在场景中的光源上随机生成一个点。
- 计算几何项,描述光是否可以到达表面上的当前点(该项为 0 或 1)。
- 如果此几何项为 1,则通过乘以衰减因子(光的距离)和材料的 BRDF 来计算该光的贡献。
我省略了一些关于如何随机选择事物的细节,但暂时不要介意(参见例如“分布光线追踪中的灯具采样”)。
在我看来,问题在于 BRDF 和光源中的光分布都不是实际函数,而是度量。
例如,对于每个入射角,完美反射镜的 BRDF 是反射方向上的狄拉克增量“函数”(即,支持在一个点上的度量,该点的质量为 1)。类似地,点光源(与面光源相对)由狄拉克增量建模,而不是密度函数。
弄清区别似乎很重要,因为它允许适当的重要性抽样。例如,在对 BRDF 进行采样时,可以:
- 均匀采样所有出射方向,并通过相应的反射分布“函数”进行缩放,
- 直接根据 BRDF 采样,之后不缩放。
介于两者之间的任何事情都是可能的,而且很重要,因为对于复杂的 BRDF,完美的重要性采样是不可能的。
现在,在 BRDF 实际上是一个狄拉克 delta 的情况下,我们看到根据 BRDF 采样变得非常重要:随机采样,我们必须以概率 1 消除贡献(因为 BRDF 在单点上得到支持,当均匀采样方向时,我们有概率 0 选择),但是如果我们碰运气并得到反射方向(质量所在的位置),那么我们必须将贡献缩放到无限大!如果我们根据 BRDF 进行采样,我们总是会生成反射方向,并且不必缩放任何东西(特别是不会遇到任何无穷大)。
那么我的问题如下:如果它们都是一般度量而不仅仅是函数,你如何将 BRDF 乘以光的贡献?在考虑 BRDF 的重要性采样和场景中的灯光分布时,如何在这一步正确地“重要性采样”?(光的采样过程应同时考虑光分布和 BRDF,以避免无穷大。)
理想情况下,人们需要永远不会产生无穷大的抽样程序,无穷大应该只是不良抽样机制的产物(如上文所述)。因此,对于随后的四种情况,计算出的贡献应该始终是有限的:
- 带有区域光的连续 BRDF(例如朗伯漫反射材质)
- 带点光源的连续 BRDF
- 带区域光的离散 BRDF(例如完美镜子)
- 带点光源的离散 BRDF
当然,理想情况下,这适用于 BRDF 和灯光的任何测量,但似乎能够正确处理上述 4 种情况是大部分工作所在。