Lecture 14: Ray Tracing 2(Acceleration & Radiometry)¶
Using AABBs to Accelerate Ray Tracing¶
Uniform Spatial Partitions(Grids)¶
Build Acceleration Grid¶
找到整个场景的AABB,划分成均匀的网格,网格的数量和大小可以根据场景的复杂度来调整。
将每个物体存储在它所占据的网格单元中。
Ray-Scene Intersection¶
对于每条光线,计算它经过的网格单元。对每个经过的网格单元,检查其中的物体与光线的交点。
用遗传算法来优化网格划分,如确定合适的网格数量,\(n_{cells} = C \cdot n_{objects}\),其中\(C\)是一个经验常数,其在3D中的取值约为27。
Spatial Partitions¶
可以使用不同的空间划分方法,如八叉树(Octree)、KD树(KD-Tree)、BSP树(BSP-Tree)等。
八叉树:将空间递归地划分为八个子空间,适用于均匀分布的场景。(类似于一个二阶魔方的划分)
KD树:根据物体的分布情况选择划分平面,适用于非均匀分布的场景。(每次划分空间时选择一个轴进行划分,将空间分成两个部分,交替使用x、y、z轴)
BSP树:使用任意方向的平面进行划分,适用于复杂场景。
BSP-Tree的划分不沿着坐标轴,开销大;八叉树划分简单,但可能不够灵活;KD-Tree在两者之间取得了平衡,适用于大多数场景。
KD-Tree¶
对于这个树,内节点需要存储划分平面的轴向和位置,并保存指向子节点的指针。叶节点存储物体列表。
实际利用KD-Tree进行光线求交时,使用光线与划分平面的交点来决定光线进入哪个子节点,从而递归地遍历树。
但这个方法很难计算哪些物体在包围盒内,而且会出现物体被划分到多个节点的情况。
Object Partitions & BVH(Bounding Volume Hierarchy)¶
BVH是指包围体层次结构,它通过将物体包围在简单的几何形状(如AABB、球体等)中来加速光线求交。
根节点是整个场景的包围体,子节点是更小的包围体,这些包围体包含部分场景中的物体,注意包围体可以重叠且不同物体不会被划分到不同的节点中。
内点点存储包围体信息和指向子节点的指针,叶节点存储物体列表和包围体信息。
Build BVH¶
- 找到大的包围盒。
- 递归地把大的包围盒划分成两个小的部分。(划分的方法有多种,如循环轴向划分、选最长轴划分、选择中位数划分)
- 重新计算两个小的部分的包围盒。
Traversal BVH¶
- 计算光线与根节点的包围盒的交点。
- 如果有交点,递归地检查子节点的包围盒。
- 如果到达叶节点,检查光线与其中的物体的交点。
- 返回最近的交点。
C++ | |
---|---|
Basic Radiometry¶
辐射度量学是研究光的传输和测量的科学。
Radiant fiux (辐射通量):单位时间内通过某个表面的光能量。
其中\(Q\)是光能量,\(t\)是时间。
Intensity (强度):单位立体角内的辐射通量。
其中\(\omega\)是立体角。而立体角的定义是:
其中\(A\)是面积,\(r\)是距离。对于球而言,\(A = 4\pi r^2\),所以球的立体角是\(4\pi\),且\(dA = r^2 sin\theta d\theta d\phi\),其中\(\theta\)是极角,\(\phi\)是方位角。
对于均匀发光的点光源,Intensity是常数,且\(\Phi = I \cdot 4\pi\)。
该公式可以计算从一个点光源向各个方向发射的光能量。
Irradiance (照度):单位面积上的辐射通量。
其中\(A\)是面积。
Radiance (辐射亮度):单位面积、单位立体角内的辐射通量。这个公式可以计算一个表面接收或发射的光能量。
其中,\(\theta\)是光线与表面法线的夹角。
Radiance是最重要的量,因为它描述了光在空间中的分布情况。