Primitives and intersection acceleration
ray box intersections
使用ray和6个plane相交,判定交点是否在box内。
grid acceleration
把物体使用voxel来简化表示,然后用ray和voxel相交,这样可以快速剔除很多物体,进一步是否判定ray和object相交可以根据自己需要来选择。
bounding volume hierarchy
其实就是BVTree,但看名字就知道怎么实现了。
surface area heuristic
在确定划分方法之后,划分的粒度是一个重要问题。
这里在ray tracing社区里,普遍认为这个SAH(surface area heuristic)是比较靠谱的方法,或者说是衡量度。
划分粒度首先要解决给定几个划分,那一个更好的问题(而且不能用实际测试数据)。
<PBR>这个书讲解的也不是很到位,后来到这里看http://www.sci.utah.edu/~wald/PhD/wald_phd.pdf算是有一个了解
SAH用一个假设,ray是在空间里均匀分布的,那么一个ray与父voxel并且与一个子voxel相交的概率是:
surface area of voxel kid/suraface area of voxel_dad.
这里的surface area就是表面积了,对于voxel的表面积计算就是立方体的表面积计算。
有了这个度量衡,那么后面的具体划分方式和粒度就可以用这个来具体推算出来。
traverse
用把bvh树用depth first order放在一个linear array里,这样遍历就飞飞快(没递归,cache效率也好)。
KD-tree
KDTree(k dimention tree)和Octree是BSP(binary space partitioning)的两个分支。
BSP:第一次听说是在doom启示录里,第一次使用是在编写找工作用的demo中,着实有感情的一个算法。
简而言之就是:如果一个bounding box里面的primitive大于一个阀值,就把这个bounding box切分成两个,如果有primitive横跨了两个切好的bounding box,它的从属关系就是这两个bounding box。
然后递归。
kd tree:这里有一个可视化的demo可以更进一步的给我们感性认识
http://donar.umiacs.umd.edu/quadtree/points/pointquad.html
kd tree就是在切分的时候使用垂直于axis的plane来切,并且这个plane不用把空间均匀的切成几分,是一个flexible的概念。
octree典型做法是等分成8分,当然我们在各种文章和《game programming gems》这种书里也都看见了,有各种灵活化的变种。