5

尝试实现蒙特卡洛路径跟踪时,我在光采样过程中遇到了障碍。

通常,程序如下:

  • 追踪从相机(或前一点)开始的光线,直到到达表面点。
  • 到达表面点后,在场景中的光源上随机生成一个点。
  • 计算几何项,描述光是否可以到达表面上的当前点(该项为 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 种情况是大部分工作所在。

4

1 回答 1

1

如果你有一个从完全镜面反射路径到点光源的狄拉克三角洲,你仍然可以评估三角洲的积分贡献。(如果您的 BRDF不是纯粹的镜面反射狄拉克三角洲,您可以并且可能应该使用普通的光线追踪来处理它......)

请注意,此“增量路径”的作用与普通光线路径不同。具体来说,普通光线的颜色表示亮度(单位:流明/球面度/m^2),它不随距离变化,而且——不考虑 BRDF 采样——仅乘以反射和透射系数。

但是,“delta ray”的颜色表示照度(单位:流明/m^2),它随距离变化(下降为 1/r^2)。此外,与亮度不同,增量路径将受到沿路径的镜面反射器和折射器曲率的影响。

为了考虑弯曲镜面的近轴行为,您需要评估射线源相对于另一端视角的导数。这应该可以用 2x2 雅可比矩阵表示,该矩阵在每次反射时乘以表示表面局部曲率的雅可比矩阵。你的距离计算也会修改这个矩阵——例如,考虑到一个完美的镜头可能会在你接近焦点时产生随距离增加的照度。这也表明您将需要处理可能的奇点,其中焦散聚焦点光源......

因为您的帧缓冲区具有有限的分辨率,所以渲染增量通常应该(在焦散奇点之外)产生有限的(尽管可能非常高)亮度。为简单起见,假设每个样本只对一个像素有贡献:上面的单位建议您必须将“增量路径”的照度除以像素的立体角,以使其与普通像素的亮度相当射线。(请注意,立体角会因像素而异——对于标准相机,您必须包含一个cos(theta)因素)

您应该能够执行类似的操作来在非镜面表面终止纯镜面路径。我猜想“三角洲射线”的统计数据也可能与传统射线的统计数据不同;你需要弄清楚它们是如何融入你的蒙特卡洛框架的。

于 2012-08-03T21:58:46.753 回答