我在光线跟踪器中使用k-d树进行空间分区。在确定给定矩形区域的划分位置时,我选择区域最大尺寸的维度,然后通过检查沿该维度的相交图元的轴对齐边界框的所有边界来查找最佳拆分窗格。对于复杂的场景,这需要大量的检查。有没有办法缩小搜索最佳拆分窗格的范围,以便不必检查所有潜在的位置,但仍然可以获得最佳窗格?
我确定了最好的"窗格通过查找具有以下公式的最低值的窗格:
TRAVERSE_COST + INTERSECT_COST * ((l_area/area * l_count) + (r_area/area * r_count))
其中area
是要拆分的矩形区域的表面区域,l_area
和r_area
是通过拆分当前区域生成的左右区域的表面区域在给定位置,l_count
和r_count
是左右子区域将包含的基元数。与分割窗格相交的基元被认为包含在两个子区域中,因此l_count + r_count
可能大于当前区域中基元的数量(TRAVERSE_COST
和INTERSECT_COST
只是通过测试不同值确定的常数)。这种方法看起来效果很好。
我的实施是基于Ingo Wald的一篇名为实时光线跟踪和交互式全局照明的论文,其中他指出最佳分割窗格位于该地区的中心和& #34;对象中位数",但我自己的测试表明,具有上述算法最低值的窗格通常会超出此范围,即使我解释"对象中位数"作为中位基元AABB的整个范围。这可能是由于实施中的任何差异,因为我只使用该文件来实现k-d树构建和遍历,而不是用于光线跟踪器的其余部分。