在计算与变换对象的射线对象相交时,大多数光线跟踪器将逆变换应用于每个射线,并计算与非变换对象的相交。因为只需要计算一次变换,就不会应用正向变换将对象放到平坦的世界空间中,从而更快,更高效吗?

评论

“只计算一次转换”是什么意思?意味着您不必计算逆变换,或者只需要变换一次对象?与几何相交相比,计算逆变换便宜,并且您肯定需要多次变换对象(到每个不同射线的空间中)。

我认为这样的假设是,在场景准备期间,所有图元都将转换为平坦的世界空间位置。 (这确实大大增加了内存使用。)然后,光线将直接与图元相交,而无需在空间之间进行预先转换,因为它们现在都位于世界空间中。

#1 楼



您是否见过射线三角形相交测试,其中三角形被变换为使一个顶点位于原点且三角形沿其中一个轴是平坦的?这样可以简化测试,但是存储逆变换以将其应用于射线比三角形本身需要更多的空间。因此,您可以说几乎所有的射线三角形测试都确实将正向变换应用于对象。

但是,大多数时候,您正在绘制许多三角形的网格,而“大多数raytracers”却没有通过对象的变换矩阵对网格中的每个顶点进行变换,它们将射线逆变换为对象空间。这样做不一定有充分的理由-在某些情况下,对网格进行预处理并将每个顶点放入世界空间中肯定可以提高性能。

然后说您在制作动画工作室,缩放路径跟踪。现在,场景几何可能无法一次全部放入RAM。预先转换所有顶点/控制点不再是性能上的胜利,因为(a)每个实例需要一个对象副本,并且(b)每次将其读入RAM时都需要对其进行转换。当绑定数据时,每条射线两个矩阵相乘的成本仍然微不足道。

浮点精度也是一个潜在的原因:当对象距原点很远时,会出现更多错误从浮点位置开始,如果对对象进行预变换,则会对每个顶点在不同方向上应用该误差,而如果对射线进行逆变换,则射线的不精确位置具有一个固定的误差量,但是顶点的误差较小相对错误。

尽管我怀疑“为什么大多数光线追踪器将光线逆变换”的真正答案是,大多数带有公共源代码的光线追踪器实现了广泛的几何图元,无论是出于教育目的还是作为概念证明,它都更容易实现。实现比N型正向变换便宜的一种射线逆变换。 (此外,如前所述,如果对象在其规范空间中,则某些交集算法会更加简单。)

#2 楼

如果可以假设相交的形状是原点,未旋转且具有单位大小,则可以大大简化大多数射线相交算法。有一些例外情况(例如具有旋转对称性的球体。),但是数学上更通用的算法通常在计算交点之前最终基本上将形状和射线都转换为原点。考虑到这一点,简单地变换光线以使交点始终出现在对象空间中会更简单,更一致。

评论


$ \ begingroup $
也可以更准确。使用浮点数时,离零越远,整数之间的分辨率越低。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
15年8月12日在1:39

$ \ begingroup $
@AlanWolfe,在计算逆变换并将其应用于ray时不会出现相同的分辨率问题吗?
$ \ endgroup $
–马克
15年8月12日在4:27