为了获得沿光线的所有命中,最简单的方法是在每个nearest_hit之后继续射线,直到你不再击中任何东西。在OptiX中意味着到达未命中程序,在OptiX Prime中意味着没有获得命中结果。
单独使用OptiX any_hit程序来收集光线上的所有命中点将不适用于使用像SBVH或TRBVH这样的拆分的边界体积层次结构,其中基元可以在较小的BVH中出现多次。这将导致重复的命中。
在OptiX Prime中,any_hit结果本身也不起作用,因为你无法像在OptiX中那样通过调用any_hit程序中的rtIgnoreIntersection()来进行正确的遍历延续。
第一种方法:
针对发射网格中的每条射线:
- 设置主光线原点和方向,
- 跟踪它以获得nearest_hit结果,
- 将下一个射线原点设置为该命中点坐标,
- 保持光线方向沿直线收集所有交叉点,
- 用小epsilon偏移ray.t_min以防止自相交。
- 重复上述过程,直到没有最近相交。
这适用于OptiX或OptiX Prime以及任何BVH加速结构。
如果预先知道预期交叉点的数量,您也可以通过一次启动one launch执行此操作。这里的限制是能够在一次扫描中存储沿每条射线的所有交叉点。根据需要存储的交叉点的数量,限制将是一次存储所有这些结果的GPU RAM的数量(每条光线的命中点阵列和结束标记,例如计数或负交叉距离)。如果您事先不知道交叉点的最大数量或数据太大而无法存储,请忘记此方法并执行上述迭代方法。