第十四章:Ray tracing2 加速结构、辐射度量学

Ray Tracing 2

  • 加速结构
  • 辐射度量学

题外话:

GTC(GPU Technology Conference):

  • DLSS(Deep Learning Super Sampling)2.0 https://zhuanlan.zhihu.com/p/116211994

    • 光栅化生成一个 1080p 的图,把它拉大成一张 4K 的图,结果不损失太多性能,同时看上去依然清晰
  • RTXGI(全局光照)https://developer.nvidia.com/rtxgi

回顾上节课:

  • 为什么要做光线追踪

  • Whitted-style ray tracing(递归的光线追踪,光线弹射到多个地方,在每个交点计算着色和阴影)

  • 光线和物体求交

    • 光线和隐式表面求交
    • 光线和三角形求交
  • AABB 包围盒

    • 理解包围盒:坐标轴上三对相对的平板
    • 光线和 AABB 盒求交

本节课:

  • AABB 盒怎么加速光线追踪?

    • 均匀的网格(Uniform grids)
    • 空间划分 (spatial partitions)
  • 辐射度量学

AABB 加速光线追踪

均匀的网格:Uniform Spatial Partitions(Grids)

先让光线和盒子求交,再进一步和盒子里的物体求交

预处理:

1.先找到场景里的一个包围盒

2.把盒子分成一堆格子

3.标记与物体表面相交的格子

image​​image

怎么判断光线继续往后传播时要和哪个盒子求交,不能每个格子都求一遍。有一个简单的思路是:如果光线往右上传播,就只看当前格子右边和上面的格子,判断光线与哪个格子有交点,再把光线移动一格。光栅化一条线:https://zhuanlan.zhihu.com/p/20213658

加速效果:
一个格子(格子很稀疏),基本没有加速效果

image

格子太密,要做很多次光线和格子的求交,效率很低

image

需要找一个平衡

image

当几何物体在场景中分布比较均匀时,格子加速的效果比较好

image

物体在场景中分布不均匀的时候,加速的效果不好

image

空间划分 Spatial Partitions

三种空间划分的结构:
Oct-Tree:8 叉树,把空间分成 8 个小方块,小方块继续分割,当格子里是空的,或物体足够少,就停止分割(平面是 4 叉树,即分成几份和维度有关系)

KD-Tree:2 叉树,每次一个格子只砍一刀(水平竖直沿着坐标轴交替划分,基本保证划分的空间是均匀的)

BSP-Tree:选一个方向砍一刀

image

KD-Tree 预处理,建立加速结构

把空间划分为二叉树:

image

数据结构:

中间节点需要存储:

  • 当前节点沿着哪个坐标轴划分
  • 划分在哪个位置(不一定划分在中间)
  • 2 个子节点

叶子节点需要存储:

  • 和格子相交的几何物体
  • image

判断光线和当前节点是不是有交点,如果有交点,继续判断和当前节点的子节点是不是有交点,一直到叶子节点,如果光线和叶子节点有交点,就求光线和叶子节点里面所有物体的交点;如果光线和当前节点没有交点就不需要继续往下找。
如果是求最近的交点就一边找一边记录最近的。

image​​image​​image​​image​​image​​image

KD-Tree 的问题:

1.不好判断几何对象(三角形)和盒子是否有交集

2.1 个对象可能和不同的盒子都有交集,即同一个物体会被多个叶子节点存储

Object Partitions & Bounding Volumn Hierarchy(BVH)

划分物体:把一个盒子里的三角形分为两部分,把两部分的三角形再重新求包围盒,然后每个包围盒继续划分,直到一个包围盒里包含的节点数够少就停止划分。

image​​image​​image​​image

BVH 的好处是:一个物体只可能出现在一个盒子里,且无需求三角形和包围盒的交点,避免了 KD-Tree 的问题。

但 BVH 也有一个问题:BVH 对空间的划分不是很严格的划分开,BoundingBox 可以相交,所以需要在划分几何形体的时候尽量减少重叠。

image

总结构造 BVH 加速结构的过程:

1.找到一个包围盒

2.递归地把包围盒中的物体拆成两部分

3.重新计算包围盒

4.当包围盒的物体足够少的时候停止递归

5.把物体信息存储在叶子节点里

怎么做节点的划分?

  • 选一个维度

  • 方式 1:每次选一个最长的轴把节点分成两半,使得节点最后分布比较均匀

  • 方式 2:取中间的三角形的位置把节点分为两半,是的分割后节点的三角形数量差不多,让这个树形结构两边保持平衡(深度小,平均搜索次数小)

    • 取中间的三角形涉及到排序:所有三角形取重心,沿一个轴排个序,找到中间的那个三角形。(也可以不用排序找中位数,快速选择算法,可以达到 O(n)的时间复杂度)
  • 如果场景是动态的,三角形数量会变化,就需要每次变化都重新算一下 BVH。

    image

BVH 的数据结构:
中间节点存储:

  • 包围盒
  • 子节点的指针

叶子节点存储:

  • 包围盒
  • 实际的物体
  • image

BVH 算法伪代码:

image

空间划分和物体划分的区别:

image

以上是 Whitted-style 光线追踪的内容。

辐射度量学 Basic radiometry

为什么要学习辐射度量学?

之间的 Blinn-Phong 模型里提到光的强度 I 是怎么得到的,他的物理意义是什么?

image

Whitted-style 光线追踪给的结果是正确的吗?

image

辐射度量学给了一种精准定义光照的物理量的方法。

辐射度量学学习的内容:
为如何描述光照定义了一系列的方法和单位

给光定义了各种空间中的属性(仍然是基于几何光学,认为光线沿直线传播):

image

  • Radiant flux,intensity,irradiance,radiance

Radiant Energy and Flux

Radiant energy 是电磁辐射的能量,单位是焦耳,用符号 Q 表示。

Radiant Flux 是单位时间的能量。

image

另一种理解:单位时间通过感光平面的光子的数量

image

光源辐射的能量:radiant Intensity,定义了方向性和能量相关的概念

物体表面接受到了多少能量:Irradiance

光线传播中的能量怎么度量:Radiance

image

Radiant Intensity

单位立体角上点光源辐射出的单位能量

image

立体角:
角度:弧长/半径

立体角:角度在三维的延伸。锥体对应的面积/求面的面积。

image

单位立体角(微分立体角)

image

对单位立体角做积分可以得到整个球面

image

在辐射度量里面通常用 ω 表示方向,ω 可以用 θ 和 φ 来定义位置,并通过 sinθdθdφ 算出单位立体角。

image

对一个点光源,radiant intensity 是单位立体角的能量,把所有方向上的单位立体角的 intensity 积分,就可以得到它的 power,反之任何一个方向的 Intensity 就是 power/4π。

image

小知识:现代 LED 灯上标注的瓦数不是真实的,而是对应于白炽灯的瓦数,LED 实际瓦数更低。

image