GAMES101-14:光线追踪2:使用AABB包围盒加速光线追踪
十四、光线追踪2:使用AABB包围盒加速光线追踪
14.1 直接使用AABB包围盒
找到包围盒
将包围盒分为格子
Grid
如果某个格子与物体的表面相交,则标记该格子
将光线与格子求交
- 如果光线与格子相交,且格子内有物体,则将光线与对应物体求交
格子过于稀疏 or 过于密集,均会使效率变低
通常,格子的数量是场景中的物体数目的整数倍:
#cells = C * #objs
14.2 空间划分 Spatial Partitions
将空间划分为大小不同的盒子
缺点:
- 难以判断哪些三角形属于当前格子
- 一个三角形可能会处在多个格子中
14.2.1 KD-Tree 预处理
- 注意,每一个部分都要划分,按照水平、竖直的顺序交替分割
- 中间节点:
- 分割轴:x、y、z
- 分割位置:在分割轴上的分割点的坐标
- 子节点:指向子节点的指针,有2个子节点
- 叶节点:
- 记录和该格子相交的物体
14.2.2 KD-Tree加速光线追踪
- 如果光线和格子没有交点,则不做操作
- 如果光线和格子有交点
- 如果格子为叶节点,则光线与叶节点中的所有物体求交
- 否则与格子的两个子节点求交
14.3 物体划分 Object Partitions
- 将物体分为两堆,然后再求包围盒
- 包围盒之间可能有相交,但可以保证一个三角形最多只在一个包围盒中
14.3.1 层次包围盒 BVH:Bounding Volume Hierarchy
- 找到一个包围盒
- 递归的将包围盒中的物体划分为两个部分
- 重新计算包围盒
- 重复23,直到每个包围和中的物体数量足够少
- 将物体存在每个叶节点中
14.3.2 划分方法
- 每次找最长的轴进行划分
- 每次找第n/2个三角形,进行划分,保证两边的三角形个数相差不多
- 根据重心坐标,划分三角形的位置
- 可以类似于找第k大数,通过快排,在O(n)时间内找到
- 如果场景中的物体移动了,就需要重新建立BVH树
14.3.3 BVH加速光线追踪
- 如果光线和包围盒没有交点,则不做操作
- 如果光线和包围盒有交点
- 如果包围盒为叶节点,则光线与叶节点中的所有物体求交
- 否则与包围盒的两个子节点求交
14.3.4 空间划分 vs 物体划分
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论