首页 > 解决方案 > 双向路径追踪,算法讲解

问题描述

我试图理解路径追踪。到目前为止,我只处理了非常基础的问题——当光线从半球内的每个交点沿随机方向发射时,然后再一次,以此类推,直到光线击中光源。结果,这种方法导致在小光源的情况下,图像非常嘈杂。

下图显示了取决于每个像素的样本(光线)数量的噪声水平。 噪音水平

我也不确定我做的一切是否正确,因为据我所知,“蒙特卡洛”方法意味着从每个交点发射几条光线,然后将它们的结果相加并取平均值。但是这种方法导致光线的数量呈指数增长,并且在 6 次反弹后达到不适当的值,所以我决定最好在最初每个像素运行几条光线(从像素的中心稍微偏移随机方向),但每个交叉点只产生 1 条射线。我不知道这种方法是否对应于“蒙特卡洛”,但至少这种方式渲染不会永远持续下去。

双向路径追踪

我开始寻找减少噪音的方法,并遇到了双向路径跟踪。但不幸的是,我无法用简单的话找到这个算法的详细解释。我所了解的是,光线是由相机和光源产生的,然后检查连接这些路径端点的可能性。

在此处输入图像描述

可以看到,如果相机发出的蓝光和光源发出的白光的交点可以自由连接(连接路径上没有障碍物),那么我们可以假设相机发出的光线可以通过点 y1, y0 直接到达光源。

但是有很多问题:

  1. 如果光源不是一个点,而是具有某种形状,那么发射光线的点一定是在这个形状的表面上随机选择的?如果您只取中心 - 那么与点光源没有区别,对吧?
  2. 我是否需要为来自相机的每条路径从光源构建一条路径,还是应该只有一条来自光源的路径,而从相机一次为一个像素构建多条路径(样本)?
  3. 对于相机和光源的路径,反弹/重新反射/折射的数量应该相同吗?或不?

但问题并没有就此结束。我听说双向跟踪方法可以很好地模拟焦散(与常规路径跟踪相比)。但是我完全不明白双向路径跟踪的方法如何对此有所帮助。

示例 1

在此处输入图像描述

最终将在此处构建路径,但反弹的数量将非常大,因此此处无法使用焦散,尽管来自相机的光线几乎指向与来自灯光的光线路径相同的点源头结束。

示例 2

在此处输入图像描述

这里不会构建路径,因为路径的端点之间有障碍物,虽然如果点 x3 连接到点 y1 可以构建,但根据算法(如果我理解一切正确的话),只有最后一个路径的点是相连的。

问题:

如果在大量情况下路径要么无法构建,要么不必要地长,那么这种算法有什么用?也许我误解了什么?我遇到了许多文章和文档,其中以某种方式描述了该算法,但大多数都是以数学方式描述的(使用各种神奇的术语,例如有偏无偏、PDF、BSDF 等),而不是……算法。我对数学和各种数学符号和措辞不是很擅长,我只是想了解做什么,如何在代码中正确实现,这些路径如何连接,以什么顺序等等。这可以用简单的话,伪代码来解释,对吧?如果有人最终能对这一切有所了解,我将不胜感激。

标签: algorithmraytracing

解决方案


推荐阅读