GAMES101-现代计算机图形学学习笔记(14)
Lecture 14: Ray Tracing 2
原课程视频链接以及官网
b站视频链接: link.
课程官网链接: link.
光线追踪的加速
上一节课说了计算光线-物体的求交通常可以通过计算光线与物体表面包围盒的求交来进行加速。这只是从物体出发的一个角度,另外一种方式是通过对场景进行划分来达到加速的效果。常用的对场景进行划分的方法有 Uniform grids 和 Spatial partitions。
Uniform grids
U n i f o r m g r i d s Uniform\,grids Uniformgrids 简单来说就是将场景划分成一个个规整的格子,通过格子来判断光线与物体的相交情况。
构建 U n i f o r m g r i d s Uniform\,grids Uniformgrids 的步骤如下:
- 找到包围盒
- 创建格子
- 存储每个对象至格子中
那么此时判定光线与物体相交就转换成光线与格子相交问题,当光线与格子相交后,再去考虑它与格子内物体的相交情况:
这种方式有一些问题:
第一个是格子的分辨率问题,如果格子的分辨率设置太小就失去了划分的意义,如果分辨率太大也不好。
第二个是格子通常只适用于规整的场景,相反,物体位置较为稀疏的场景就不适用这种划分方案,因为此时很多格子都不存储物体,大量时间被浪费在了光线与格子的求交上:
Spatial partitions
S p a t i a l p a r t i t i o n s Spatial\,partitions Spatialpartitions 通常有 Oct-Tree 、KD-Tree 以及 BSP-Tree 三种划分方案:
下面将在二维对三种方案进行讨论:
Oct-Tree:每次迭代都将区域重新切分为均匀四块,按一定规则停止切分(如切分得到的四块区域中,三块都没有物体;或四块区域都还有物体,但是此时的区域已经较小)
KD-Tree:总是沿某个轴进行切分,每次划分总会在原来的区域上生成两块新的区域(这里沿轴的次序是由交替进行的,如二维中总是按着 x/y 或 y/x 的次序进行交替切分)
BSP-Tree:每次都是沿着一定方向进行切分(非水平或竖直)
KD-Tree 预处理
KD-Tree 每次划分都会生成新的两块区域,然后再在两块区域内进行划分,直至满足递归截至条件。
下图显示了一个三维k-d树.。第一次划分(红色)把根节点(白色)划分成两个节点,然后它们分别再次被划分(绿色)为两个子节点。最后这四个子节点的每一个都被划分(蓝色)为两个子节点:
假设空间 A 被划分为如图所示 KD-Tree,那么它的结构等同于其中树结构所所描述:
数据结构:
中间节点(A,B,C,D)存储了:
- 划分后的轴
- 划分后的切分平面
- 子节点的指针
叶子节点(1,2,3,4,5)存储了:
区域中包含的物体的列表
遍历:
- 发射光线从根节点出发,分别判断光线与左右节点是否相交,若相交则进入2;否则,则与节点不相交
- 递归判断相交直至叶子节点,若与叶子节点相交,进入3
- 挨个判断叶子节点存储物体与光线的相交情况
下列图分别显示了光线遍历至 B 节点的情况: