0

我不是在问如何计算光线与特定图元的交点,我是在问当前的方法是如何尽快确定场景中数百万个图元中的哪一个是光线相交的下一个图元。

我听说 octtrees 和 kd-trees 是常用的。我不知道是否还有其他方法也是当前的竞争者。

如果使用八叉树,是否只允许每个立方体跟踪其 8 个子立方体中的任何一个是否与任何几何形状相交?任何没有得到相应分支的,每个子立方体都有一个分支。因此,一个人沿着树向下直到找到一个最终节点,该节点给出了它相交的有限数量的基元?如果构建这样一个八叉树,则可以通过将光线从其起点移动到每个立方体中下降到可以验证射线在立方体中不与几何体相遇或下降到可以检查的点来跟踪射线少量基元(射线可能会错过,需要一个移动到下一个立方体)?

无论如何,如何找到下一个交叉点的问题看起来是一个巨大的性能因素,那么目前最流行的方法是什么,它们的优缺点是什么?

4

2 回答 2

1

这是一个很大的话题。您可以在 tis 网站 www.scratchapixel.com 上找到一些信息。查看有关加速技术的课程。光线追踪很慢(实际上是计算机),因此进行简单的光线-三角形相交测试(测试场景的所有三角形)很快就会变得非常昂贵。为了解决这个问题,您可以使用加速结构,并且您在帖子中提到了一些技术(八叉树、kd 树)。一个与另一个的性能是非常主观的,取决于你的实现,你需要什么等等。BVH 和 kd 树都被认为是好的。你可以很容易地在网上找到作者评论不同类型的加速结构、它们的优缺点等的论文。比如加速结构调查。

于 2013-09-04T15:03:35.343 回答
1

当今使用最广泛的加速结构是BVH(*B*ounding *V*olume *H*ierarchies),它们是当前大量研究的主题(High Performance Graphics 2013 的前 3 篇最佳论文中有 2 篇关于 BVH:HPG 最佳论文)。

BVHs 上的维基百科页面是一个很好的起点。这个概念非常简单,将基元簇分组到一个包围体(通常是一个包围盒)中,然后将所述包围体的簇分组到更大的体积中,并重复直到在最高级别有整个场景的单个包围体。BVH 构建速度快、易于实施且应用广泛。

另一个以前流行的替代方案是 kd 树,但是它们的构建时间比 BVH 长一个数量级,并且往往需要更多的内存;八叉树工作,但没有被广泛使用。

最近出现了一系列非相干光线追踪方法,称为分而治之,它们基本上完成了通常在 kd 树或 BVH 构造中在光线遍历期间进行的原始分区。如果场景的某些部分没有与它们相交的任何光线,这可能比构建完整的加速结构然后跟踪要快一些(因为在分而治之的方法中,这些图元永远不需要被分割),但是,每次您想要追踪一批新的光线时,您都必须重复该过程。对于相干光线或大部分静态场景,这种方法不是一个好主意,即使在为发挥算法优势而量身定制的场景中,它是否值得也值得怀疑。

个人建议:使用 BVH。

于 2013-09-05T01:43:14.980 回答