尝试实施蒙特卡罗路径追踪,我在光采样程序中遇到了麻烦。
通常,程序如下:
我遗漏了一些有关如何随意选择内容的细节,但暂时不介意(例如参见“配线光线跟踪中的灯具采样”)。
正如我所看到的那样,问题在于BRDF和光源中的光分布都不是实际功能,而是措施。
例如,对于每个入射角,完全反射镜的BRDF是反射方向上的dirac delta“函数”(即,在一点上支持的度量,在该点处质量为1)。类似地,与密度函数相反,点光(与区域光相反)由狄拉克三角洲建模。
直接区分似乎很重要,因为它允许适当的重要性采样。例如,在对BRDF进行采样时,可以:
中间的任何内容也是可能的,而且很重要,因为对于复杂的BRDF来说,完全重要的采样是不可能的。
现在,在BRDF实际上是一个dirac delta的情况下,我们看到根据BRDF进行采样变得极其重要:随机抽样,我们必须以概率1忽略贡献(因为BRDF在单个点上得到支持) ,我们在均匀采样方向时选择概率为0,但如果我们确实碰到了幸运并得到了反射方向(质量为),那么我们必须将贡献扩大到无限大!如果我们根据BRDF进行采样,我们总是生成反射方向,而不必扩展任何东西(特别是不会遇到任何无穷大)。
我的问题如下:如果它们既是一般措施而不仅仅是功能,那么如何将BRDF“乘以”光的贡献?在考虑BRDF的重要性采样和场景中的灯光分布时,如何正确地“重要性采样”? (灯的采样程序应考虑光分布和BRDF,以避免无穷大。)
理想情况下,人们需要的采样程序永远不会产生无穷大,无穷大这应该只是不良采样机制的假象(如上所述)。因此,对于随后的四种情景,计算出的贡献应始终是有限的:
当然,理想情况下,这适用于BRDF和灯光的任何测量,但似乎能够正确地获得上述4种情况是大多数工作的地方。
答案 0 :(得分:1)
如果从完全镜面路径到点光源的Dirac delta,您仍然可以评估delta的总积分贡献。 (如果您的BRDF 不是纯粹的镜面Dirac delta,您可以并且可能应该使用普通的光线追踪来处理它...)
请注意,此“delta路径”的行为与普通光线路径不同。具体来说,普通光线的颜色代表luminance(单位:流明/球面度/平方米),它在距离方面是不变的,而 - 除了BRDF采样 - 只乘以反射系数和传输。
然而,“delta ray”的颜色代表illuminance(单位:流明/平方公尺),相对于距离不不变(它下降为1) / R ^ 2)。此外,与亮度不同,增量路径将受到沿路径的镜面反射器和折射器的曲率的影响。
要考虑弯曲镜面的近轴行为,您需要评估射线源相对于另一端视角的导数。这应该由2x2雅可比矩阵表示,该矩阵在每次反射时乘以表示表面局部曲率的雅可比矩阵。您的距离计算也将修改此矩阵 - 例如,当您接近焦点时,考虑一个完美的镜头可能会产生随距离增加的照度。这也暗示你需要处理可能的奇点,其中焦散点集中点光源......
因为你的帧缓冲区具有有限的分辨率,渲染一个delta通常应该(在焦散奇点之外)产生一个有限的(虽然可能很高)亮度。为简单起见,假设每个样本只贡献一个像素:上面的单位表明你必须将“三角形路径”的照度除以像素的立体角,使其与普通的亮度相当。射线。 (请注意,立体角度会因像素而异 - 对于标准相机,您必须包含cos(theta)
因子)
你应该可以做类似的事情,在非镜面表面终止一个纯粹的镜面反射路径。我猜想“三角洲”的统计数据也可能与传统射线的统计数据不同;你需要弄清楚它们如何适合你的蒙特卡洛框架。