尝试实现蒙特卡洛路径跟踪时,我在光采样过程中遇到了麻烦。
通常,过程如下:
我遗漏了一些关于如何随机选择事物的细节,但暂时不要介意(例如,参见“分布射线追踪中的灯具采样”)。
如我所见,问题在于BRDF和光源中的光分布都不是实际功能,而是度量。
例如,对于每个入射角,完全反射镜的BRDF是反射方向上的狄拉克δ“函数”(即,在一个点上支撑的度量,在该点处的质量为1)。类似地,与密度函数相反,点光源(与区域光源相对)由狄拉克三角洲建模。
直截了本地进行区分似乎很重要,因为它可以进行适当的重要性抽样。例如,在对BRDF进行采样时,可以:
两者之间的任何事情都是可能的,而且很重要,因为对于复杂的BRDF而言,完美重要性抽样将不可能。
现在,在BRDF实际上是狄拉克三角洲的情况下,我们看到根据BRDF进行采样变得非常重要:随机采样,我们必须以概率1消除贡献(因为BRDF在单个点上得到了支持) ,当均匀采样方向时,我们有0的概率选择),但是如果碰到幸运并获得反射的方向(质量在该方向上),那么我们就必须将贡献缩放为无限大!如果我们根据BRDF进行采样,那么我们总是会生成反射方向,而不必进行任何缩放(特别是不会遇到任何无限大的情况)。
然后,我的问题是:如果它们既是一般度量,又不仅仅是功能,那么您如何将BRDF与光的贡献“相乘”?在同时考虑BRDF的重要性采样和场景中的灯光分布时,如何在这一步骤适本地“重要性采样”? (光的采样过程应同时考虑光的分布和BRDF,以避免无限期。)
理想情况下,将需要一种永远不会产生不确定性的采样程序,无限性应该只是不良采样机制的产物(如上所示)。因此,对于随后的四个场景,计算出的贡献应该始终是有限的:
当然,理想情况下,无论是对BRDF还是对灯光而言,此方法都适用,但是似乎能够正确解决以上4种情况,这是大多数工作要做的地方。
最佳答案
如果您具有从完全镜面反射路径到点光源的Dirac增量,则仍可以评估该增量的总积分贡献。 (如果您的BRDF不是纯粹的镜面狄拉克增量,则可以并且可能应该使用普通的光线跟踪对其进行处理...)
请注意,此“增量路径”的行为将不同于普通光线路径。具体来说,普通射线的颜色表示luminance(单位:流明/恒星/m ^ 2),它相对于距离是不变的,并且-除了BRDF采样-仅与反射和透射系数相乘。
但是,“三角射线”的颜色表示illuminance(单位:流明/m ^ 2),它相对于距离不是不变的(下降为1/r ^ 2)。同样,与亮度不同,增量路径将受到沿该路径的镜面反射器和折射器的曲率的影响。
要考虑曲面镜面曲面的近轴行为,您将需要评估射线源相对于另一端视角的导数。这应该由2x2雅可比矩阵表示,该矩阵在每次反射时都乘以代表表面局部曲率的雅可比矩阵。您的距离计算也将修改此矩阵-例如,考虑到当您接近焦点时,理想的镜头可能会产生随着距离增加的照度。这也表明您将需要处理可能的奇点,在这种情况下,焦散会聚焦于点光源。
因为您的帧缓冲区具有有限的分辨率,所以正常情况下(在苛刻的奇点之外)渲染delta应该会产生有限的(尽管可能非常高)亮度。为简单起见,假设每个样本仅贡献一个像素:上面的单位建议您必须将“增量路径”的照度除以像素的立体角,以使其与普通亮度相当。射线。 (请注意,立体角会随每个像素而变化-对于标准相机,您必须包括cos(theta)
系数)
您应该能够执行类似的操作以在非镜面终止纯镜面路径。我猜想,“德尔塔射线”的统计数据也可能与传统射线的统计数据有所不同。您将需要弄清楚它们如何适合您的Monte Carlo框架。