Optix如何获得ray与场景的所有交点

为了获得沿光线的所有命中,最简单的方法是在每个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的数量(每条光线的命中点阵列和结束标记,例如计数或负交叉距离)。如果您事先不知道交叉点的最大数量或数据太大而无法存储,请忘记此方法并执行上述迭代方法。

https://devtalk.nvidia.com/default/topic/930666/optix/radiation-physics-problems/post/4857707/#4857707

发布了80 篇原创文章 · 获赞 14 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/novanova2009/article/details/90582166
今日推荐