1.前言
前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算,那么会进行像素数量 x 光线弹射次数 x 多边形平面数量次光线与平面交点计算,计算会非常庞大,非常慢。
例如下图中的经典场景San Miguel,面数达到10.7M,渲染一张1080P图片,光线平均3次弹射,共需要进行66万亿次交点计算。

这样庞大的计算量是完全不能接受的,而一条光线在场景中弹射时和绝大多数平面是不会相交的,因此需要通过一些算法进行优化,这个算法就是包围盒技术(Bounding Box)。
2.轴对齐包围盒(Axis-Aligned Bounding Box)
用简单的方盒子称为包围盒(Bounding Box)将物体完全包裹,如果光线与包围盒没有交点,那显然不会与物体中任何三角面有交点,那也就没必要去遍历物体的三角面了。
在几种包围盒方式中,AABB即轴对齐包围盒因为包围盒三组对面分别与三个空间坐标轴平行,便于计算而使用最为广泛(下图中间)。

那么AABB包围盒就可以理解为三个不同的对面形成的交集,这样可以方便进行光线与包围盒的求交运算。如下图所示。


那么到底如何求光线与包围盒的交点呢?先将问题简化成直线与、
两对平面的交点,将三维转化成二维。

如上图最左边所示,求光线与一对 x 平面(左右无限远)的交点,将先进入的交点(距离光线起点 o 最近的那个)记为 tmin,后出去的交点记为 tmax。紧接着如中间图所示计算出光线与 y 平面(上下无限远)的两个交点同样记为另外一组 tmin, tmax。注意:如果任意的 t < 0,那么这代表的是光线反向传播与对应平面的交点。
那么如何知道光线在什么时候进入盒子,又在什么时候出去了盒子呢?
对于二维来说,如上图最右边所示,在 tmin 时间进入了盒子,在 tmax 时间出去了盒子。这实际就是求两组交点构成的线段的交集。那么这个结论是怎么得出的呢?
回想三维的情况,三维的盒子就是三个对面,最重要的核心思想:
1.只有当光线进入了所有的平面才算是真正进入了盒子中。
2.只要当光线离开了任意平面就算是真正离开了盒子。
那么,就可以得到一种算法,在三维中三组不同的对面各计算一次进入对面的最小时间 tmin 和离开对面最大时间 tmax ,时间不管是正还是负。最后算出三对进入和离开对面的时间交集,就得出了进入盒子时间 和离开盒子时间

3859

被折叠的 条评论
为什么被折叠?



