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

时间:2012-05-16 04:59:37

标签: graphics 3d 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种情况是大多数工作的地方。

1 个答案:

答案 0 :(得分:1)

如果从完全镜面路径到点光源的Dirac delta,您仍然可以评估delta的积分贡献。 (如果您的BRDF 是纯粹的镜面Dirac delta,您可以并且可能应该使用普通的光线追踪来处理它...)

请注意,此“delta路径”的行为与普通光线路径不同。具体来说,普通光线的颜色代表luminance(单位:流明/球面度/平方米),它在距离方面是不变的,而 - 除了BRDF采样 - 只乘以反射系数和传输。

然而,“delta ray”的颜色代表illuminance(单位:流明/平方公尺),相对于距离不变(它下降为1) / R ^ 2)。此外,与亮度不同,增量路径将受到沿路径的镜面反射器和折射器的曲率的影响。

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

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

你应该可以做类似的事情,在非镜面表面终止一个纯粹的镜面反射路径。我猜想“三角洲”的统计数据也可能与传统射线的统计数据不同;你需要弄清楚它们如何适合你的蒙特卡洛框架。