我正在编写一个 3D 光线跟踪器作为个人学习项目 ( Enlight ),并且遇到了一个与在光线和对象场景之间进行交叉测试相关的有趣问题。
情况是:
- 我有许多可以与光线相交的基元(球体、盒子、平面等)及其组。我统称为这些场景对象。
- 我希望能够通过将对象图元包装在一个
Transform
对象中来对具有任意仿射变换的对象图元进行场景化(重要的是,这将使同一图元的多个实例能够在场景中的不同位置使用,因为图元是不可变的) - 场景对象可以存储在包围体层次结构中(即我正在做空间分区)
- 我的相交测试适用于
Ray
表示部分射线段的对象(起始向量、归一化方向向量、起始距离、结束距离)
问题是,当光线射中 Transform 对象的边界框时,看起来与包含在其中的已转换图元进行交集测试的唯一方法是将 转换Ray
为已转换的坐标空间。这很容易,但是如果光线没有击中任何变换的对象,我需要回退到原始对象Ray
以继续跟踪。由于 Transforms 可能是嵌套的,这意味着我必须为Ray
完成的每个交集跟踪维护一整堆 s。
这当然是在整个应用程序的内部循环中,也是主要的性能瓶颈。它将每秒调用数百万次,因此我热衷于最大限度地降低复杂性/避免不必要的内存分配。
有没有一种聪明的方法可以避免分配新Ray
的/保留Ray
堆栈?
还是有更聪明的方法可以做到这一点?