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

通常,过程如下:

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

  • 我遗漏了一些关于如何随机选择事物的细节,但暂时不要介意(例如,参见“分布射线追踪中的灯具采样”)。

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

    直截了本地进行区分似乎很重要,因为它可以进行适当的重要性抽样。例如,在对BRDF进行采样时,可以:
  • 统一采样所有传出方向,并通过相应的反射分布“函数”(
  • )进行缩放
  • 直接根据BRDF进行采样,之后不进行缩放。

  • 两者之间的任何事情都是可能的,而且很重要,因为对于复杂的BRDF而言,完美重要性抽样将不可能。
    现在,在BRDF实际上是狄拉克三角洲的情况下,我们看到根据BRDF进行采样变得非常重要:随机采样,我们必须以概率1消除贡献(因为BRDF在单个点上得到了支持) ,当均匀采样方向时,我们有0的概率选择),但是如果碰到幸运并获得反射的方向(质量在该方向上),那么我们就必须将贡献缩放为无限大!如果我们根据BRDF进行采样,那么我们总是会生成反射方向,而不必进行任何缩放(特别是不会遇到任何无限大的情况)。

    然后,我的问题是:如果它们既是一般度量,又不仅仅是功能,那么您如何将BRDF与光的贡献“相乘”?在同时考虑BRDF的重要性采样和场景中的灯光分布时,如何在这一步骤适本地“重要性采样”? (光的采样过程应同时考虑光的分布和BRDF,以避免无限期。)

    理想情况下,将需要一种永远不会产生不确定性的采样程序,无限性应该只是不良采样机制的产物(如上所示)。因此,对于随后的四个场景,计算出的贡献应该始终是有限的:
  • 具有区域灯光的连续BRDF(例如Lambertian漫射 Material )
  • 带点灯的连续BRDF
  • 带区域灯的离散BRDF(例如,完美的镜子)
  • 带点光源的离散BRDF

  • 当然,理想情况下,无论是对BRDF还是对灯光而言,此方法都适用,但是似乎能够正确解决以上4种情况,这是大多数工作要做的地方。

    最佳答案

    如果您具有从完全镜面反射路径到点光源的Dirac增量,则仍可以评估该增量的总积分贡献。 (如果您的BRDF不是纯粹的镜面狄拉克增量,则可以并且可能应该使用普通的光线跟踪对其进行处理...)

    请注意,此“增量路径”的行为将不同于普通光线路径。具体来说,普通射线的颜色表示luminance(单位:流明/恒星/m ^ 2),它相对于距离是不变的,并且-除了BRDF采样-仅与反射和透射系数相乘。

    但是,“三角射线”的颜色表示illuminance(单位:流明/m ^ 2),它相对于距离不是不变的(下降为1/r ^ 2)。同样,与亮度不同,增量路径将受到沿该路径的镜面反射器和折射器的曲率的影响。

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

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

    您应该能够执行类似的操作以在非镜面终止纯镜面路径。我猜想,“德尔塔射线”的统计数据也可能与传统射线的统计数据有所不同。您将需要弄清楚它们如何适合您的Monte Carlo框架。

    10-04 21:17