首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求相关资源,例如articles,libraries或tips。
我的程序需要对射线与三角形相交进行密集计算(有数百万条射线和三角形),我的目标是使其尽可能快。
我所做的是:
使用我所知道的最快的ray-triangle算法。
使用八叉树。(摘自《游戏编程珍宝 1, 4.10. 4.11》)
使用高效且鲁棒的射线盒相交算法,该算法用于八叉树算法。
它比我应用那些更好的算法之前更快,但我相信它可以更快,您能否阐明任何可能使其更快的地方?
提出这些问题的地方是ompf2.com。一个关于实时(尽管也是非实时)光线追踪主题的论坛
OMPF 论坛是解决这个问题的正确场所,但既然我今天在这里......
不要使用光线/盒子交集进行八叉树遍历。您可以将它用作树的根节点,但仅此而已。一旦知道了根盒子入口和出口的距离,就可以计算到 x、y 和 z 分割平面(细分盒子的平面)的距离。如果到前面和后面的距离分别是f和b,那么你可以通过分析f、b、x、y、z距离来确定盒子的哪些子节点被击中。您还可以确定遍历子节点的顺序并完全拒绝其中的许多子节点。
最多可以击中 4 个子级,因为射线从一个八分圆开始,只有在穿过 3 个分割平面之一时才会改变八分圆。
此外,由于它变得递归,您将需要子节点的进入和退出距离。这些距离是从您已经计算的集合 (f,b,x,y,z) 中选择的。
我已经对此进行了很长一段时间的优化,并且可以有把握地说,对于许多深度的树来说,您仍然可以实现大约一个数量级的性能。我从你现在所在的地方开始。
您可以进行多种优化,但所有优化都取决于问题的具体领域。就通用算法而言,您走在正确的轨道上。根据域的不同,您可以:
使用空间排序和快速交集算法,您已经有了一个良好的开端。为了一次追踪单条光线,最好的结构之一(对于静态场景)是使用表面积启发式构建的 K-d 树。
但是,对于真正的高速光线追踪,您需要利用:
我建议您从“使用连贯网格遍历进行光线追踪动画场景”开始。它提供了这种现代方法的一个易于理解的示例。您还可以按照参考文献了解如何将这些想法应用于 K-d 树和 BVH。
在同一页面上,还可以查看“光线追踪动画场景的最新技术”。
另一组很棒的资源是多年来的所有 SIGGRAPH 出版物。这是一个竞争非常激烈的会议,因此这些论文往往都是一流的。
最后,如果您愿意使用现有代码,请查看 OpenRT 的项目页面。
我见过的一个有用的资源是图形工具杂志。根据您的场景,另一个 BVH 可能比八叉树更合适。
此外,如果您还没有使用分析器查看您的性能,那么您应该使用分析器。 Shark 在 OSX 上非常棒,我在 Windows 上使用 Very Sleepy 也获得了很好的结果。