Skip to content

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

  1. 找到大的包围盒。
  2. 递归地把大的包围盒划分成两个小的部分。(划分的方法有多种,如循环轴向划分、选最长轴划分、选择中位数划分)
  3. 重新计算两个小的部分的包围盒。

Traversal BVH

  1. 计算光线与根节点的包围盒的交点。
  2. 如果有交点,递归地检查子节点的包围盒。
  3. 如果到达叶节点,检查光线与其中的物体的交点。
  4. 返回最近的交点。
C++
Intersect(Ray ray, BVH node){
    if(ray misses node.bbox) return;
    if(node is leaf node){
        test intersection with objects in node;
        return closest intersection;
    }
    hit1 = Intersect(ray, node.child1);
    hit2 = Intersect(ray, node.child2);

    return the closer of hit1 and hit2;
}

Basic Radiometry

辐射度量学是研究光的传输和测量的科学。

Radiant fiux (辐射通量):单位时间内通过某个表面的光能量。

\[ \Phi = \frac{dQ}{dt} \]

其中\(Q\)是光能量,\(t\)是时间。

Intensity (强度):单位立体角内的辐射通量。

\[ I = \frac{d\Phi}{d\omega} \]

其中\(\omega\)是立体角。而立体角的定义是:

\[ \omega = \frac{A}{r^2} \]

其中\(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 (照度):单位面积上的辐射通量。

\[ E = \frac{d\Phi}{dA} \]

其中\(A\)是面积。

Radiance (辐射亮度):单位面积、单位立体角内的辐射通量。这个公式可以计算一个表面接收或发射的光能量。

\[ L = \frac{d^2\Phi}{dA \cdot d\omega \cdot cos\theta} \]

其中,\(\theta\)是光线与表面法线的夹角。

Radiance是最重要的量,因为它描述了光在空间中的分布情况。