我是计算机图形学的新手。这些天来,我一直在尝试了解使用加速数据结构进行光线跟踪的方式。我多次遇到“早期射线终止”一词,也曾在互联网上浏览过几次,但未能找到令人满意的解释。
终止射线是什么意思早期,为什么我们必须这样做?
我注意到,几乎每当提到“早期光线终止”时,都会提到“从前到后遍历”一词。
具体前后遍历如何工作(例如,在kd-tree中)?

#1 楼

前后遍历是一种想法,当通过加速结构遍历光线时,我们要检查在其他节点之前的前方节点,即更靠近摄影机的节点。如果只希望第一个与曲面的相交(在光线跟踪中通常如此),则如果在前节点中有相交,则不需要遍历其后方的任何节点;因为任何可能的交叉点都会比您已经找到的交叉点晚。这样可以节省时间。

例如,在kd树中,每个节点都有一个拆分平面,它将空间划分为两个子节点。首先,您将下降到距离相机更近的子位置,并且只有在找不到相交处时,您才下降到另一个子位置。

光线终止似乎是在体积上下文中使用的术语渲染。当您穿过光线使光线衰减的介质(例如雾,烟,浑浊的液体等)穿过光线时,如果超过一定距离,则光线不会对图像产生更多影响。如果您有10米可见度的浓雾,则看不见11米外的物体。

您可以预先计算衰减达到99%左右的距离(永远不会达到100%) %,但以指数方式接近)。没有理由使光线与距离更远的物体相交,因此,使用加速结构时,您可以简单地丢弃该距离以外的任何节点。实际上,射线成为以固定长度终止的线段。如果在该长度范围内没有击中任何东西,则没有任何进一步检查的意义。 (另一种适用于有限长度射线的情况是阴影射线。您只想将其追溯到原始光源;超出该范围的任何交点都与阴影无关。)

评论


$ \ begingroup $
感谢@NathanReed。还有1个问题。假设我要首先遍历树的宽度,我处于级别0(即,树的根,我还没有划分树,我有一个包含所有场景图元的边界框)。我沿轴划分边界框,以使左子节点距离摄像机更近。然后,我发现某个光线R与左节点相交。对于正确的子节点及其所有将来的子节点,应尽早终止R。但是我仍然必须测试R与该左节点的将来子节点的交集,对吗?
$ \ endgroup $
– S.E.K.
2015年12月10日7:29



$ \ begingroup $
@ user2651062通常,在开始遍历树之前,您应该已经构建了整个树。您的评论听起来好像您正在尝试同时构建和遍历?否则,“未来子节点”是什么意思?无论如何,都必须遍历与射线或线段相交的所有子节点。如果它与左孩子相交,则您将下降到左孩子中,并为其子重复该过程。如果它们都与射线/段相交,则可能需要同时进入两个子级。
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年12月10日在20:01