假设我们正在路径跟踪中,并且有一个对象具有一定数量的漫反射和一定数量的镜面反射。

在路径跟踪器中处理该对象的最佳或正确方法是什么?

查看smallpt(http://www.kevinbeason.com/smallpt/),它不允许对象同时具有两者,而是强制使材质成为漫反射或镜面反射。 />
我还看到了其他路径跟踪代码,该代码滚动了一个随机数以使用漫反射和镜面反射的亮度作为随机滚动中的权重来选择走哪条路。

我还看到了同时发生路径和发散并汇总结果的代码,其中每个递归射线乘以其对应的反射率。

我看到折射与所有

是否有物理上正确的方法来处理这些情况?

评论

相关

折射和反射的光的比例取决于入射角。您是否正在考虑这一点?例如,如果要忽略极化,则使用菲涅耳方程或Schlick近似。

#1 楼

让我们退后一步。
进行路径跟踪时,您正在进行Monte Carlo积分。
这是什么意思?您尝试通过采样求解$ \ int f(x)\ mathrm {d} x $。
蒙特卡洛积分表示对于足够大的$ n $:$ \ frac {1} {n} \ sum_ { i = 0} ^ nf(x_i)\ rightarrow \ int f(x)p(x)\ mathrm {d} x $

如果我们求和$ \ frac {f(x_i)} { p(x_i)} $我们得到$ \ frac {1} {n} \ sum_ {i = 0} ^ n \ frac {f(x_i)} {p(x_i)} \ rightarrow \ int f(x)\ mathrm {d} x $。
现在您的$ f(x)$是渲染方程式,您便可以自己近似渲染方程式。

现在我们在同一页面上关于基础知识,让我们考虑一下您的操作。
您生成一条光路,它将成为示例$ \ frac {f(x_i)} {p(x_i)} $之一。为了做到这一点,您可以在路径的每个步骤中模拟光与表面的相互作用。而且,您总是会更新当前的路径概率$ p(x_i)$。

现在,处理具有多种射线可以传播的材料的正确方法是什么?没有一种正确的方法。唯一重要的部分是,您的值$ n $,$ f(x_i)$和$ p(x_i)$保持正确。

当您偏离路径并生成两条光线时,您必须相应地增加总样本数$ n $,因为现在您已经完成了两个样本。然后将这两个路径都当作起点分开处理。

如果只想继续一条路径,则可以使用俄罗斯轮盘赌的方式。
定义三个间隔(一个常见的一种方法是选择时间间隔作为0和1之间数字的分区。这些间隔的相对大小必须与材料成比例。棘手的部分是如何设计它。在我的课程中,我们定义了一个数字反射率$ \ rho $。
我们绘制一个介于0到1之间的随机数,如果它小于$ \ rho $则路径结束。否则我们会反思。如果您进行了足够的采样,则BRDF将注意加权镜面反射部分与漫反射部分。

当然,您可以通过重要性抽样来改善此问题,这可能是您遇到问题的地方。对于非常镜面的表面设计,随机分布只会从镜面反射方向绘制更多方向。休息会弥漫。我对实际构建路径跟踪器没有足够的经验来帮助您设计一个,但是您的资源可能在这里有。

这里又是重要的:设计它,以便您知道可能性一个特定的方向,然后保持您的$ p(x_i)$不变,这样您最终可以除以该值并获得正确的蒙特卡洛估计。

; TL; DR没有正确的方法。请务必牢记样本的概率。

我希望我不会完全遗漏您的问题。

加法:
蒙特只要您通过概率校正加权,Carlo采样将始终使无穷样本与正确值收敛。这意味着,即使您使用完整的愚蠢方法来生成样本,但如果做的时间足够长,那也将起作用。也许不是您的一生或曾孙的一生,但确实如此。