Lecture14_光线追踪2(Ray Tracing 2)_GAMES101 课堂笔记
Lecture 13 内容:
Lecture 14 内容概览:
- 使用 AABBs 加速光线追踪
- 均分的格子
- 空间划分(Spatial partitions)
- 辐射度量学(Basic Radiometry)
第一部分:光线追踪加速
一、均匀的空间划分(Grids)
(一) 预处理 - 构建加速网格
划分格子主要有图中所示的三个步骤(图中有一个格子也应涂上)。对于第3步:最大的圆中有一个空白格,是因为只考虑表面(即圆周所在的单元格)。
(二)光线与场景交叉:
一束光线摄入,首先按照摄入顺序建立射线遍历的网格;然后依次便利每一个单元格是否与物体交叉。
另外,关于格子划分的个数和大小也有讲究。如果格子数划分较少(例如:1个),这样并不能实现加速;如果格子划分太多,反而会因为便利许多格子使效率低下。因此发明了一种启发式算法尽量选取适中的格子数。计算方法如下图:
(三)Uniform优缺点分析:
优点:适合对于分布均匀的规则的图像进行加速,例如下图:
缺点:对于大规模空白图像,分布不均匀,很难找到某个小的物体;因此,不适合用格子解决。例如下图:
二、空间划分(Spatial Partitions)
主要有以下三种方法:
- Oct-Tree(八叉树):切8份,在 2D 场景中为 4 叉;在 3D 场景中为 8 叉。但是在更高维的场景中将面临问题。
- KD-Tree : 沿着某一个维度不断二分(类似二叉树思想)。
- BSP-Tree : 斜二分方法,但是由于不是方方正正,计算比较复杂,尤其是对于高维度场景,相当麻烦。
建立树应在光线追踪前完成。下面以 KD-Tree 举例,概述划分过程。例如下图,仅展示一部分划分过程:
KD-Tree 数据结构
KD-Tree 如何加速光线追踪?
利用结构划分格子 ==> 光线与划分顺序的格子(先大后小)依次判定是否相交 ==> (找交点)若相交,判定是否与物体相交;否则不相交,开始判定下一个格子是否与光线相交。
KD-Tree缺点:
- 一个物体可能存在多个格子中。
- 需要判断三角形与格子求交。
上面两个问题比较难解决,于是逐渐发明了另外一种方法:物体划分。
由于很难判断三角形与格子相交,
三、物体划分(Object Partitions)
该方法目前被广泛应用。这种方法形成的加速结构叫做:BVH(Bounding Volume Hierarchy)。
BVH是将物体完整划分到两个部分中,然后不断向下进行划分,重新求Bounding box。例如下图:
(一)建立 BVHs 过程:
- 查找边框(bounding box)
- 递归地划分在两个子集对象集
- 重新计算子集的边界框(Bounding box)
- 必要时停止划分
- 存储在每个叶子节点中的对象
(二)怎样划分结点
- 选择一个维度分裂
- 启发法#1:总是选择节点的最长轴
- 启发法#2:中位数物体进行分割,即物体个数平均划分(使得划分的数量相当,便于查找。例如:快速选择算法,可以实现 \(O(n)\) 效率。)
(三)划分的终止条件
通常是当划分区域内的物体个数小到某一个数时,停止划分。(例如 \(\leq 5\) )。
(四)BVHs 的数据结构
四、空间划分 vs 物体划分
第二部分:辐射度量学(Basic radiometry)
一、辐射度量学作用
在光线追踪时,Whitted style 并没有展示很真实、正确的效果。因此引入辐射度量学,是为了从物理上,更精准的描述物体。
二、定义
- 测量系统和单位照明
- 精确地测量光的空间特性
- 新的术语:Radiant flux, intensity, irradiance, radiance
- 在物理上,以精准的方式进行照明时计算
三、计算流程
(一)Radiant Energy and Flux(Power)
定义:辐射能是电磁辐射的能量。它以焦耳为单位测量,并用符号表示为:
定义:辐射通量(功率)发射的能量,反射,发射或接收,每单位时间。
一些重要的光线定义:
(二) Radiant Intensity
1. 定义:
-
关于立体角
1) 立体角定义:
2D 内为 角(Angle:\(\theta = \frac{l}{r}\)),3D 内为立体角(solid angle,\(\omega=\frac{A}{r^2}\))。
2)立体角微积分
3. 各方向的点光源
对所有方向上的求积分: