加速结构(加速光线与场景的物体求交)
把包围盒分成很多个小格子,当小格子与物体表面相交时,就标记该格子。
当光线进入包围盒时,就会不停的和一路上的小格子发生交互,如果小格子里有物体,就判断光线是否与物体交互,如果没有交互则继续前进,如果发生交互就记录并返回。
由于在某些地方比较空旷,所以对空旷地区的划分并不需要太细,对比较密集的区域才划分细一些
使用KD-Tree来建立加速结构,建立KD-Tree过程
对包围盒沿着轴方向进行划分,中间节点不存储物体,只在叶子节点存储物体信息
在KD-Tree中查找光线与物体的求交,需要在光线前进的方向不停的与包围盒检测。
但KD-Tree有一个比较严重的问题。包围盒中有些物体是与包围盒有交集,因为场景物体是由三角形构成,而很难判断三角形与包围盒有交集。
于是使用另外的一种加速结构BVH,它根据场景中的物体进行划分,这样就避免了判断三角形是否与包围盒有交集。
构造BVH的过程:把一个包围盒切分成两部分,重新计算这两个部分的包围盒,不断切分下去,直到包围盒内的三角形足够少
怎么样对一个节点划分,选取最长的那个轴,根据中位数进行划分。
中间节点存储包围盒和指向子节点的指针,叶子节点存储包围盒和三角形
伪代码:判断光线与BVH根节点是否相交,如果不相交则直接返回,接着判断相交的是否是叶子节点,如果是就判断光线是否与叶子节点内的物体相交。
如果不是叶子节点,就递归到子节点去判断。