基本原理中使用AABB作为判断光线和物体相交的加速。
在AABB内部如何快速判断判断光线和物体的相交情况呢?主要分为种方法:
- Uniform grids
- Spatial partitions
注意这里使用的加速结构是在光线追踪之前做的准备工作。
Grids
分格子,然后记住每个格子里有哪些物体。碰到格子的话,再和这个格子里的物体求交。
这样的话就沿着直线找就可以了(怎么沿着直线?比如,线是右上的,找到一个格子后,往右找或者往上找)
那么怎么划分是合理的呢?
一般认为:
格子的划分对排列整齐大小整齐的物体是work well的,但是对于分布不均形状复杂的是工作不好的。
Spatial Partitioning
这里有一些比较经典的按照空间结构划分的加速结构。
比如Oct-Tree(八叉树),KD-Tree,BSP-Tree。
八叉树是指把一个空间分为8块(3D空间下),但是八叉树的问题是在不同空间维度下的分块数是不同的。
KD-Tree是我先横着切一刀,分成两块,再对每块竖着切一刀分成两块,再横着...直到切到我们规定的策略。
BSP-Tree是按照一个方向去切,分完之后再按另一个方向。
KD-Tree
KD-Tree是我先横着切一刀,分成两块,再对每块竖着切一刀分成两块,再横着...直到切到我们规定的策略。下面是一个示意图(A的左孩子应该也会被切直到满足我们的条件,比如条件是有1个物体等等),其中我们存放的物体应该在叶子节点上:
求交的时候会先和父节点求交,如果和这个块有交点再和孩子节点求交直到和叶子结点(物体)求交。
Object Partitions & Bounding Volume Hierarchy (BVH)
上面的空间划分结构(以KD-Tree为例)有两个问题,一是物体可能散步在多个块中;二是物体(三角面片)在不在这个块中并不好判断。
所以就诞生了使用物体作为划分的BVH这也是比较常用的Ray Tracking加速的作法。
它的主要想法是根据三角面做划分,然后一堆三角面的包围盒作为一块。这样就解决了上面两个问题。
PS:假如划分按照物体的个数均分树可能也会平衡些。也可以有一些别的划分策略: