在路径追踪中处理点光源和精确反射

Wil*_*ill 5 3d graphics raytracing montecarlo

试图实现蒙特卡罗路径追踪,我在光采样程序中遇到了麻烦.

通常,程序如下:

  • 跟踪从相机(或从前一点)开始的光线,直到到达表面点.
  • 达到表面点后,在场景中的光源上随机生成一个点.
  • 计算几何项,描述该光是否可以达到曲面上的当前点(该项为0或1).
  • 如果此几何项为1,则通过乘以衰减系数(光的距离)和材料的BRDF来计算该光的贡献.

我遗漏了一些关于如何随机选择事物的细节,但暂时不介意(参见例如"分布光线跟踪中的灯具采样").

我认为问题在于,BRDF和光源中的光分布都不是实际功能,而是测量.
例如,对于每个入射角,完美反射镜的BRDF是反射方向上的dirac delta"函数"(即,在一点上支持的度量,在该点处质量为1).类似地,与密度函数相反,点光(与区域光相对)由狄拉克三角洲建模.

直接区分似乎很重要,因为它允许适当的重要性抽样.例如,在对BRDF进行采样时,可以:

  • 均匀地对所有传出方向进行采样,并通过相应的反射分布"函数"进行缩放,
  • 直接根据BRDF进行采样,之后不进行缩放.

介于两者之间的任何事情也是可能的,而且很重要,因为对于复杂的BRDF来说,完全重要的采样是不可能的.
现在,在BRDF实际上是一个dirac delta的情况下,我们看到根据BRDF进行采样变得极其重要:随机抽样,我们必须以概率1忽略贡献(因为BRDF在单个点上得到支持) ,我们在均匀采样方向时选择概率为0,但如果我们确实击中了幸运并获得了反射方向(质量为),那么我们必须将贡献扩大到无限大!如果我们根据BRDF进行采样,我们总是生成反射方向,而不必扩展任何东西(特别是不会遇到任何无穷大).

我的问题是如下:如果它们既是一般措施而不仅仅是功能,那么如何将BRDF"乘以"光的贡献?在考虑BRDF的重要性采样和场景中的灯光分布时,如何在此步骤中正确地"重要性采样"?(灯的采样程序应考虑光分布和BRDF,以避免无穷大.)

理想情况下,人们需要采样程序,这些程序永远不会产生无穷大,无穷大,这应该只是不良采样机制的假象(如上所述).因此,对于随后的四个场景,计算的贡献应始终是有限的:

  • 具有区域光的连续BRDF(例如朗伯漫射材料)
  • 连续BRDF带点光源
  • 具有区域光的离散BRDF(例如完美的镜子)
  • 离散BRDF带点光源

当然,理想情况下,这适用于BRDF和灯光的任何测量,但似乎能够正确地获得上述4种情况是大多数工作的地方.

com*_*orm 1

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

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

然而,“δ 射线”的颜色代表照度(单位:流明/m^2),它不会随距离变化(它会以 1/r^2 的形式衰减)。此外,与亮度不同,增量路径将受到沿路径的镜面反射器和折射器曲率的影响。

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

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

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