因此,我目前正在阅读加速度数据结构,到目前为止,我听说有2种主要方案。对象细分和空间细分。

边界体积层次结构属于对象细分方法,而K-d /八叉树则属于后者。但是我很难区分两个,因为它们看起来几乎相同。

我之前为我的GPU raytracer实现了一个数据结构,我认为这是一个Octree,但我不确定不再。这是根据Kajiya的论文“光线追踪复杂场景”得出的。我要直接引用他。


我们可以花费更多的计算机时间来构建更好的
层次结构。即使没有对它们进行连贯的建模,中值切割方案也可以将附近的对象组合在一起。

先前的算法尝试根据对象之间的相互邻近性对对象进行分组。 ,但它一次只能沿一个维度进行。
通过使用八叉树,一次沿三个维度将对象分组可能会更好。此预处理步骤与[Glassner 84]或[Kaplan 85]中描述的步骤非常相似。区别
是,如果对象跨越两个或多个八叉​​树单元,则将其任意放置在它们中的任意一个中。此外,在
预处理完成之后,八叉树仅用于定义
层次结构。每个对象仍然必须分配有不同的边界体积。


因此,我以相同的方式构造了这种结构。首先,我做了一个Octree,如果球体的中心在该单元格中,则将球体插入该单元格中。每次我检查叶节点是否包含两个以上的球体。如果是这样,我必须再次细分这些单元。八叉树完成后,我遍历了所有隔室,并对其最小的x,y,z和最大的x,y,z进行了调整。这样做是为了避免球体的某些部分位于当前所在像元之外的情况(由于其中心位于该像元中)。

根据本文,上述结构是BVH?但是我在想它是八叉树吗?有什么区别?

2)其次,到目前为止,我仅插入了球体。三角形是怎么回事?叶节点的最大阈值应该是多少,在此阈值之后我可以细分为梯形的数量?

#1 楼

好吧,之后我做了很多研究,这篇论文对我们很有帮助。

Macdonald 1988年的“空间细分算法”。

所以总结一下我的理解。其中一些是显而易见的原因,但阅读本文后更有意义,我将在这里尝试做同样的事情。

1)在BVH中,我们将对象细分为较小的部分。因此,例如一个由成千上万个三角形组成的龙模型,我们首先从覆盖整个龙的边界体积开始。然后我们一次又一次地细分直到满足我们的条件。在BVH中,与八叉树相比,叶节点通常有1个对象。但是,尚不清楚是指对象(球体)还是单个三角形,因为如果将三角形划分,球体可能包含数百个三角形。这是一张解释BVH的图片。



相反,Octrees / K-d树和其他空间细分递归地划分空间。本文给出的八叉树的简单图片。



2)上面的图片显示了另一个区别。也就是说,在空间细分中,我们有不相交的空间区域或体素或单元集,无论您要称呼它们如何。相反,BVH具有不相交的对象集。

这意味着在八叉树中,一个对象可以分配给1个以上的体素。因此,尽管可以使用邮箱等技术来避免这种情况,但我们可能不得不一次又一次地检查该对象。但是,在BVH中,情况并非如此,因为对象一次只能位于1个边界体积内,因此仅当光线与当前所在的边界体积相交时,才可以检查一次相交。

3)本文提到的另一个区别是,在空间细分遍历算法中,通常计算射线从当前相交的子节点的出射点,并计算出刚好越过该出射点的新点,并从该信息中找到下一个子节点。这样做的好处是遍历可能会在碰到对象后立即停止。

另一方面,BVH无法做到这一点,因为在BVH中,我们可能会在节点中重叠对象。在这种情况下,我们将必须维护一个相交对象的列表,并找到最接近的对象。一个很好的例子在“ Kajiya的光线追踪复杂场景”中给出了

,我们可以看到,尽管射线首先与上层BV相交,但最接近的物体实际上位于下层BV内,而上层BV实际命中没有关于不同空间细分结构的信息。



现在我如何实现该结构的这一部分,似乎Kajiya提出的建议是使用八叉树方案为BVH定义遍历算法。最后,当我重新计算每个像元的边界体积时,这放宽了许多体素边界,导致多个像元重叠。在执行此操作之后,该结构与“不相交的空间集”不同,而与“不相交的对象集”相似,因此它本质上是BVH。

请注意,此操作听起来似乎是一种有效的优化对于空间细分结构,这是放宽体素的边界,以避免让所有体素都跟踪与它们重叠的对象。这样,我们将1个对象分配给1个体素并放宽其范围。

但是这样做会失去空间细分结构的遍历效率,在这种情况下,仅相交1个对象就可以停止。其他职业选手也可能迷路了。到目前为止,这就是我所了解的。

如果有人想添加更多内容,