这里回顾GAMES101 Lecture 14,这一讲完成了加速结构,介绍了辐射度量学。

课程主页:

课程作业:

课程视频:

本讲内容

  • 如何使用AABB加速光线追踪的计算过程,即如何加速和物体求交;
    • 均匀格子;
    • 空间划分;
  • 辐射度量学;

基本思路

  • 对于光线和物体求交的过程;
  • 我们先考虑光线和物体包围盒求交;
    • 如果和包围盒有交点,即和物体求交;

均匀空间划分(格子)

预处理

对于空间中的物体,首先找到包围盒:

其次将盒子划分为格子:

最后判定哪些格子中有物体表面(下图中标记为灰色):

光线场景相交

有了之前的准备工作,可以介绍光线和场景的相交:

  • 光线穿按顺序穿过网;
  • 对于每个格子:
    • 测试与在该格子内所有物体的是否相交;

图示:

这里有个问题,就是如何判断光线和哪个格子相交,老师给出的方法如下:

  • 假设已经和格子a相交,根据光线的方向检查和a周围的格子是否相交,然后找到距离最近的格子;
    • 这也是光栅化一条线的方法;

这里的整体思路是尽量多做光线和盒子的求交,减少和物体的求交,那么加速效果如何呢?这和格子的分辨率有关。

格子分辨率

如果只有一个格子,那么:

如果格子太多,那么需要计算很多次光线和格子相交:

实际中,人们发现了一个启发式的方法,划分的格子数量为:

  • $cells =C \times objs$;
  • 在3维中,$C=27$;

小结

  • 格子法可以一定程度上加速;
  • 但问题是,如果物体分布不均匀,则会浪费很多计算量;
  • 一个缓解方式是非均匀划分;

非均匀空间划分

非均匀空间划分是指格子大小不同的划分:

说明:

  • Oct-Tree
    • 八叉树,将空间划分为8份;
    • 平面内为4份;
    • 对于$n$维空间,需要划分为$2^n$份,这样当维度增加,划分的工作了太大;
  • KD-Tree
    • 对Oct-Tree的改进,每次只对某个维度进行划分;
    • 选择划分的维度有一定技巧;
  • BSP-Tree
    • Oct-Tree的改进,每次对某个方向进行划分;
    • 但是计算不方便;

KD-Tree划分

这里介绍KD-Tree的例子。

第一次沿竖直方向划分:

第二次沿水平方向划分:

后续以此类推:

这样划分构成了一棵树:

  • 内部节点存储
    • 分割轴:x轴、y轴或z轴
    • 分割位置:分割平面沿轴的坐
    • 子节点:指向子节点的指针
    • 内部节点不存储物体
  • 叶节点存储
    • 物体列表

遍历KD-Tree

现在考虑如何遍历KD-Tree。

第一步发现和节点A有交点:

所以要判断和其子节点是否有交点:

因为子节点是叶节点,所以无需继续判断。所以接下来判断和另一个子节点是否有交点即可:

以此类推,继续进行上述步骤即可:

小结

对于KD-Tree:

  • 如果节点为叶节点:
    • 则判断和叶节点中的物体是否幼教;
  • 如果节点不是叶节点:
    • 如果和节点的包围盒有交点,则判断和其子节点是否有交点;

问题

  • 对于KD-Tree,很难判断包围盒和空间中的三角形是否有交集,这也是KD-Tree的弱点;
  • 另一个问题是,一个物体可能存在于多个叶节点中;

如何解决这些问题,需要介绍BVH。

Bounding Volume Hierarchy (BVH)

BVH的思路很简单:

  • 不从空间划分;
  • 从物体划分;

例子

第一步还是引入一个包围盒:

第二步将物体划分为两部分,然后分别求出包围盒:

以此类推:

小结

算法流程:

  • 查找边界框;
  • 递归地将物体集拆分为两个子集;
  • 重新计算子集的边界框;
  • 必要时停止;
  • 在每个叶节点中存储对象;

构造BVH

如何划分节点?

  • 选择要拆分的维度;
  • 启发式#1:始终选择节点中的最长轴;
    • 划分后的长度相同;
  • 启发式#2:在中间对象位置拆分节点;
    • 划分后的数量相同;

终止标准?

  • 启发式:当节点包含少量元素时停止
    (例如 5 个);

BVH使用的数据结构

内部节点存储

  • 边界框;
  • Children:指向子节点的指针;

叶节点存储

  • 边界框;
  • 对象列表;

节点表示场景中的物体集合

  • 子树中的所有对象;

伪代码

Intersect(Ray ray, BVH node) {
    if (ray misses node.bbox) return;
    if (node is a leaf node)
        test intersection with all objs;
        return closest intersection;
        
    hit1 = Intersect(ray, node.child1);
    hit2 = Intersect(ray, node.child2);
    
    return the closer of hit1, hit2;
}

空间划分VS物体划分

  • 空间划分(例如KD-tree)
    • 将空间划分为不重叠的区域;
    • 一个对象可以包含在多个区域中;
  • 对象划分(例如BVH)
    • 将物体集划分为不相交的子集;
    • 每个集合的边界框可能在空间上重叠;

辐射度量学

动机

观察:

  • 在作业3中,我们实现了Blinn-Phong模型;
  • 光强度$I$为$10$;
  • 但是$10$什么?

另一方面:

  • Blinn-Phong模型很多假设不正确;

要回答,解决这些问题,就需要学习辐射度量学。

简介

辐射度量学测量系统和物体的照明,准确度量光的空间特性:

  • 新术语:Radiant flux, intensity, irradiance, radiance;

辐射度量在物理上准确地定义光照。

Radiant Energy and Flux (Power)

定义:Radiant Energy是电磁辐射的能量,以焦耳为单位,用如下符号表示:

定义:Radiant flux(power)是单位时间内发射、反射、传输或接收的能量:

即在单位时间内流过传感器的光子数量。

Radiant Intensity

定义:Radiant Intensity是点光源发出的每单位立体角的功率:

图示:

角和立体角

角度:圆上的对圆弧长度与半径之比。

计算公式:

圆的角度为$2\pi$。

图示:

立体角:球体对向面积与半径平方的比值:

计算公式:

球的立体角为$4\pi$。

计算公式:

图示:

可微立体角

在球面上,可以计算出立体角:

积分可得:

即球面的立体角为$4\pi$。在实际中,我们利用立体角表示方向。

Radiant flux(power)和Radiant Intensity的关系

将Radiant Intensity关于立体角积分,即可得到Radiant flux,图示:

公式: