询问有关快速光线追踪算法的资源

问题描述 投票:0回答:5

首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求相关资源,例如articleslibrariestips

我的程序需要对射线与三角形相交进行密集计算(有数百万条射线和三角形),我的目标是使其尽可能快。

我所做的是:

  1. 使用我所知道的最快的ray-triangle算法。

  2. 使用八叉树。(摘自《游戏编程珍宝 1, 4.10. 4.11》)

  3. 使用高效且鲁棒的射线盒相交算法,该算法用于八叉树算法。

它比我应用那些更好的算法之前更快,但我相信它可以更快,您能否阐明任何可能使其更快的地方?

performance algorithm geometry raytracing
5个回答
3
投票

提出这些问题的地方是ompf2.com。一个关于实时(尽管也是非实时)光线追踪主题的论坛


2
投票

OMPF 论坛是解决这个问题的正确场所,但既然我今天在这里......

不要使用光线/盒子交集进行八叉树遍历。您可以将它用作树的根节点,但仅此而已。一旦知道了根盒子入口和出口的距离,就可以计算到 x、y 和 z 分割平面(细分盒子的平面)的距离。如果到前面和后面的距离分别是f和b,那么你可以通过分析f、b、x、y、z距离来确定盒子的哪些子节点被击中。您还可以确定遍历子节点的顺序并完全拒绝其中的许多子节点。

最多可以击中 4 个子级,因为射线从一个八分圆开始,只有在穿过 3 个分割平面之一时才会改变八分圆。

此外,由于它变得递归,您将需要子节点的进入和退出距离。这些距离是从您已经计算的集合 (f,b,x,y,z) 中选择的。

我已经对此进行了很长一段时间的优化,并且可以有把握地说,对于许多深度的树来说,您仍然可以实现大约一个数量级的性能。我从你现在所在的地方开始。


1
投票

您可以进行多种优化,但所有优化都取决于问题的具体领域。就通用算法而言,您走在正确的轨道上。根据域的不同,您可以:

  1. 引入门户系统
  2. 将计算转移到 GPU 并利用并行计算
  3. 最近光线追踪中一个非常流行的趋势是边界体积层次结构

1
投票

使用空间排序和快速交集算法,您已经有了一个良好的开端。为了一次追踪单条光线,最好的结构之一(对于静态场景)是使用表面积启发式构建的 K-d 树。

但是,对于真正的高速光线追踪,您需要利用:

  • 相干光线包
  • 弗鲁斯塔
  • SIMD

我建议您从“使用连贯网格遍历进行光线追踪动画场景”开始。它提供了这种现代方法的一个易于理解的示例。您还可以按照参考文献了解如何将这些想法应用于 K-d 树和 BVH。

在同一页面上,还可以查看“光线追踪动画场景的最新技术”。

另一组很棒的资源是多年来的所有 SIGGRAPH 出版物。这是一个竞争非常激烈的会议,因此这些论文往往都是一流的。

最后,如果您愿意使用现有代码,请查看 OpenRT 的项目页面。


0
投票

我见过的一个有用的资源是图形工具杂志。根据您的场景,另一个 BVH 可能比八叉树更合适。

此外,如果您还没有使用分析器查看您的性能,那么您应该使用分析器。 Shark 在 OSX 上非常棒,我在 Windows 上使用 Very Sleepy 也获得了很好的结果。

© www.soinside.com 2019 - 2024. All rights reserved.