前面已经说过,均匀空间划分存在一个划分粒度的问题,所以,为了解决这个问题,就出现了基于树形结构的空间划分。基于KD-tree进行空间划分就是其中一种
KD-tree每次划分的时候,会按顺序沿着x、y、z轴进行依次划分(也可以不按照这个顺序来),如下图所示,首先进行x轴方向的划分,然后对两个部分进行y方向的划分,然后再进行x轴方向的划分,依次递归,当每个小AABB足够小或者每个AABB找那个的物体个数很少时,递归终止
在KD-tree中,存储物体信息的节点都是叶子结点(没有子节点的节点)
示例
比如,一个空间的物体如下,并且按照KD-tree的方式被划分
当划分完成,判断光线与与两个子空间1和B是否相交,该光线不仅与1相交,还与B相交
所以就需要一次遍历子树1和B,拿子树1来说,子树1的下半部分不和光线相交,所以就不用遍历子树1的下半部分,这样就能起到一定程度的加速作用
D区域被划分成4和5(停止继续划分),但是区域4并没有与光线相交的叶子结点,而3号区域中有与光线相交的节点,就能得出交点。
KD-tree将AABB空间不断分割,如果光线与哪一部分的子AABB不想交,则可以直接忽略光线与该AABB的交点计算,节省了计算量;但是,因为按照空间划分,就存在某些三维物体有可能介于两个AABB中间。
为了能够让所有的物体都存在于一个AABB中,人们自然又提出了基于物体划分的算法
四、BVH(Bounding Volume Hierarchy)加速光线追踪
BVH是基于三角形面进行空间划分的光追加速算法,首先将场景中的物体用一个大的AABB包起来
然后将大的AABB划分为两个小的AABB,这两个小的AABB可能会重叠,但是每个三角形面都必定在其中一个AABB中
接着重复对两个子AABB进行划分,递归条件就是AABB中三角形的数量小于某个值,下图只对左面的进行了划分,没有对右边的子AABB进行划分
参考
GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出