我不是在问如何计算光线与特定基元的交点,我问的是当前的方法是尽可能快地确定场景中数百万个基元中的哪一个是下一个基线相交。
我听说通常使用octtrees和kd-trees。我不知道是否还有其他方法也是当前的竞争者。
如果使用八叉树,是否只允许每个立方体跟踪其8个子立方体中的任何一个是否与任何goemetry相交?任何没有得到相应分支的东西和每个确实得到分支的子多维数据集。因此,一个人从树上下来,直到找到一个最终节点,它给出了它相交的有限数量的基元?如果构建这样的八叉树,则可以通过将一条光线从其起始点移动到每个下降的立方体到可以验证光线在立方体中没有几何形状或者下降到可以检查的点的位置来追踪光线。少数基元(光线可能会错过,需要一个移动到下一个立方体)?
无论如何,人们如何找到下一个交叉点的问题看起来像是一个巨大的性能因素,那么目前最重要的方法是什么?它们的优缺点是什么?
答案 0 :(得分:1)
这是一个非常大的话题。您可以在www.scratchapixel.com上找到一些信息。看看有关加速技术的课程。光线跟踪很慢(实际上是计算机),因此进行一个简单的光线 - 三角形交叉测试,在其中测试场景的所有三角形,变得非常昂贵。 要利用这个问题,您可以使用加速结构,并在帖子中提到了一些技巧(八叉树,k-d树)。一个对另一个的表现是非常主观的,取决于你的实现,你需要它等等.BVH和k-d树都被认为是好的。您可以在网上轻松找到作者评论不同类型的加速结构,它们的优缺点等的论文。这些用于加速结构调查。 如今的趋势是加速结构不会存储在内存中,而是在投射光线时即时创建的技术。
答案 1 :(得分:1)
目前使用最广泛的加速结构是 BVH (* B * ounding * V * olume * H * ierarchies),它们是当前研究的主题(前三名中最受欢迎的2项)来自High Performance Graphics 2013的论文在BVHs上发表:HPG Best Papers)。
The wikipedia page on BVHs是一个很好的起点。概念非常简单,将基元的群集组合成边界体积(通常是边界框),然后将所述边界体积的群集分组成更大的体积,并重复直到最高级别为整个场景存在单个边界体积。 BVHs构建快速,易于实施,并且被广泛使用。
另一种先前流行的替代方案是k-d树,但是它们比BVH更长的构建时间并且往往需要更多的内存;八叉树有效,但没有广泛使用。
最近出现了一系列称为分而治之的非相干光线跟踪方法,它基本上是在光线穿越过程中通常在k-d树或BVH构造中进行原始分割。如果场景的某些部分没有任何与它们相交的光线,那么这比构建完整加速结构然后跟踪要快一些(因为在分而治之的方法中,这些基元永远不需要被分区),但是每次你想要追踪一批新的光线时,你必须重复这个过程。对于相干光线或大多数静态场景,这种方法并不是一个好主意,而且即使在为算法优势量身定制的场景中它是否值得,也值得怀疑。
个人推荐:使用BVH。