内容-加速结构
Uniform Spatial Partitions (Grids)
进一步细分包围盒,形成一个加速结构
假设:
- 光线于盒子求交是十分快的
- 光线与物体求交是十分慢的
预处理 Build Acceleration Grid
光线追踪 Ray-Scene Intersection
先光栅化一条线,知道光线与哪些格子相交。
然后对于相交且有物体的格子,光线与其物体进行三角形的光线追踪计算,判断是否有交点
Grid Resolution 与 算法效率
一个经验平衡法去决定格子的划分大小
比较适用与场景中物体很多而且大小和分布比较均匀的情况
不适用于“Teapot in a stadium”的情况 大场景,分布不均匀
实际上很多GPU算法还是用的格子
Spatial Partitions
格子虽然很好用,但是任然有很多不足,接下来就是对这些不足进行一个优化,让划分与物体的分布更加适配
- Oct-Tree 八叉树,不好在于根维度相关,三维是8 二维是4 一维是2
- KD-Tree k维树 ,与八叉树很类似,但是它每次找到一个格子,只沿着一个轴砍一刀,砍成两半。水平和竖直还有z轴交替划分,让划分基本是一个均匀的
- BSP-Tree 二叉空间分割树,每次选一个方向把树砍开,根KD-Tree类似。在维度高的时候不好计算
KD-Tree
在做光线追踪之前建立好的一个加速结构
- 所有物体只存在于叶子节点上
- 用前序遍历进行区域遍历并求交,父节点相当于是包围盒的包围盒,还是那个逻辑(如果包围盒都没有交点,那么里面的物体更加没有交点)
存在的问题:
- 子包围盒如何知道它与哪些三角形有交集(很难写对)
可能出现的案例:三角形的三个顶点都不在盒子里,但是与盒子是相交的。
- 物体可能存在于多个盒子里,比如图上的3 4 5
冗余的储存
Object Partitions & Bounding Volume Hierarchy (BVH)
如果划分空间有诸多问题,那么可以划分物体
现在几乎都是用BVH,它解决了KD-Tree的两个问题
他可以说的KD-Tree的升级,因为BVH的划分方式与其是一致的,只是
- BVH划分的是物体
- KD-Tree划分的是空间
因此首先就解决了同一个物体出现在不同的划分结构中的问题,另外包围盒也很好计算
但是它引起了另外的问题:包围盒空间是可能相交的
构建BVH
要想尽可能划分好,那就是让重叠区域尽可能小
如何划分来构建BVH,也就是如何建立一颗尽可能平衡的树(平衡的树最大深度k小,平均搜索次数小):
快速选择算法,找到第k大的数
如果物体动了,那就要重新来划分BVH了