目录
加速结构
对AABB结构进行优化来加速光线追踪的速度
- 均匀网格(Uniform grids)
- 空间划分(Spatial partitions)
均匀空间划分(Uniform Spatial Partitions)
-
对整个空间用小格子进行划分,判定哪个格子与物体的表面相交。
-
先判断格子与光线是否相交,若相交,进一步再判断格子里的物体是否与光线相交。
-
可以通过格子的结构排列很快求出与光线相交的格子。因此这种方法可以提高算法的速度。
-
当格子过大或者过小时,效果都不好,因此根据经验,格子的数量由以下公式决定(格子数量 = 常数C×场景中物体的数量)
PS:当场景中物体分布不均匀时,不适合使用这种方法。
空间划分
空间划分例子

- Oct-Tree:八叉树(在二维是四叉树)
- KD-Tree:每次划分只沿着一条轴砍一刀,分成两块。竖直和水平在树的层次中交替。例:第一层一个节点水平分割,第二层两个节点竖直分割。
- BSP-Tree:二分法,每次选一个方向将空间分割开。
KD-Tree

KD-Tree将空间划分为一个二叉树结构。
KD-Tree存储数据结构
非叶子节点存储:
- 划分轴:xyz轴
- 划分的位置:划分平面的沿轴位置
- 指向子节点的指针
- 非叶子节点不存储物体
叶子节点存储: - 对应区域包含的物体
KD-Tree结构中进行光线追踪

对树结构进行逐级判断,判断每个节点表示的包围盒与光线是否有交点。
扫描二维码关注公众号,回复:
12445955 查看本文章

- 若一个节点与光线有交点,则其子节点都必须进行下一步判断。
- 若一个节点与光线没有交点,则可直接忽略该节点及其子节点,不用进行下一步判断。
KD-Tree的缺点
- KD-Tree很难建立,因为判断三角形和盒子是否相交是困难的。三角形可能三个顶点都不在盒子中,但与盒子相交,这种情况很难判断。
- 上图一个圆圈与3,4,5节点都相交,则这三个节点都必须存储该圆圈。
物体划分
Bounding Volume Hierarchy(BVH)结构
BVH是将物体划分为多个部分。将多个三角形划分为一堆一堆的,再分别求不同堆的包围盒。


一个物体只会出现在一个节点中。先划分再求包围盒。
包围盒是有可能相交的。为了提高效率,应该让包围盒的相交尽可能小。
总结,BVH过程:
- 先为整个场景计算一个包围盒
- 把包围盒中的物体根据物体数量划分为两个部分
- 重新计算划分后的两个部分的包围盒
- 递归进行计算
- 停止条件:如当叶子节点内部有足够少的三角形
如何划分一个节点
- 选择一个维度来划分
- 技巧1:总是选择最长的轴来进行划分,让最长的轴变短
- 技巧2:选择中间的物体作为划分。
- 三角形从左到右进行排列,找到中位数三角形进行划分,这样可以使两个节点的三角形数平衡。(快速选择:可在O(n)时间内完成找到第K大的数字)
BVH的存储
非叶子节点存储:
- 包围盒
- 子节点指针
叶子节点存储: - 包围盒
- 包含的物体
BVH算法

空间划分 vs 物体划分

辐射度量学
可以精确的定义光,光与物体的交互,实现真实的光照。
在物理上精确的定义了光的各个属性
Radiant Energy and Flux(Power)
- Radiant Energy:是光源辐射出来的能量总量(Q),单位是焦耳(J)。
- Radiant Flux(power) : 是单位时间内光源辐射出的能量,单位是瓦特(W)。
FLux还可理解为单位时间内通过的sensor(光子)
Radiant Intensity
单位时间内光源向单位立体角(Solid Angles)所辐射出的能量。
Angle:使用弧长来定义,弧长/半径
立体角:三维空间内的角,面积/半径平方
单位立体角:
对于整个球来说,立体角为:
使用立体角可以代表从秋心发出的光线的方向。
Intensity就是光源在任何方向的亮度。将每个立体角方向的randiant Intensity积分得到radiant flux。