Games101 计算机图形学课程笔记: Lecture14 Ray Tracing 2

加速结构

对AABB结构进行优化来加速光线追踪的速度

  • 均匀网格(Uniform grids)
  • 空间划分(Spatial partitions)

均匀空间划分(Uniform Spatial Partitions)

  • 对整个空间用小格子进行划分,判定哪个格子与物体的表面相交。

  • 先判断格子与光线是否相交,若相交,进一步再判断格子里的物体是否与光线相交。

  • 可以通过格子的结构排列很快求出与光线相交的格子。因此这种方法可以提高算法的速度。

  • 当格子过大或者过小时,效果都不好,因此根据经验,格子的数量由以下公式决定(格子数量 = 常数C×场景中物体的数量)

PS:当场景中物体分布不均匀时,不适合使用这种方法。

空间划分

空间划分例子

  • Oct-Tree:八叉树(在二维是四叉树)
  • KD-Tree:每次划分只沿着一条轴砍一刀,分成两块。竖直和水平在树的层次中交替。例:第一层一个节点水平分割,第二层两个节点竖直分割。
  • BSP-Tree:二分法,每次选一个方向将空间分割开。

KD-Tree

KD-Tree将空间划分为一个二叉树结构。

KD-Tree存储数据结构

非叶子节点存储:

  • 划分轴:xyz轴
  • 划分的位置:划分平面的沿轴位置
  • 指向子节点的指针
  • 非叶子节点不存储物体
    叶子节点存储:
  • 对应区域包含的物体

KD-Tree结构中进行光线追踪

对树结构进行逐级判断,判断每个节点表示的包围盒与光线是否有交点。

  • 若一个节点与光线有交点,则其子节点都必须进行下一步判断。
  • 若一个节点与光线没有交点,则可直接忽略该节点及其子节点,不用进行下一步判断。

KD-Tree的缺点

  • KD-Tree很难建立,因为判断三角形和盒子是否相交是困难的。三角形可能三个顶点都不在盒子中,但与盒子相交,这种情况很难判断。
  • 上图一个圆圈与3,4,5节点都相交,则这三个节点都必须存储该圆圈。

物体划分

Bounding Volume Hierarchy(BVH)结构

BVH是将物体划分为多个部分。将多个三角形划分为一堆一堆的,再分别求不同堆的包围盒。

一个物体只会出现在一个节点中。先划分再求包围盒。
包围盒是有可能相交的。为了提高效率,应该让包围盒的相交尽可能小。

总结,BVH过程:

  • 先为整个场景计算一个包围盒
  • 把包围盒中的物体根据物体数量划分为两个部分
  • 重新计算划分后的两个部分的包围盒
  • 递归进行计算
  • 停止条件:如当叶子节点内部有足够少的三角形

如何划分一个节点

  • 选择一个维度来划分
  • 技巧1:总是选择最长的轴来进行划分,让最长的轴变短
  • 技巧2:选择中间的物体作为划分。
    • 三角形从左到右进行排列,找到中位数三角形进行划分,这样可以使两个节点的三角形数平衡。(快速选择:可在O(n)时间内完成找到第K大的数字)

BVH的存储

非叶子节点存储:

  • 包围盒
  • 子节点指针
    叶子节点存储:
  • 包围盒
  • 包含的物体

BVH算法

空间划分 vs 物体划分

辐射度量学

可以精确的定义光,光与物体的交互,实现真实的光照。
在物理上精确的定义了光的各个属性

Radiant Energy and Flux(Power)

  • Radiant Energy:是光源辐射出来的能量总量(Q),单位是焦耳(J)。
  • Radiant Flux(power) : 是单位时间内光源辐射出的能量,单位是瓦特(W)。

    FLux还可理解为单位时间内通过的sensor(光子)

Radiant Intensity

单位时间内光源向单位立体角(Solid Angles)所辐射出的能量。

Angle:使用弧长来定义,弧长/半径

立体角:三维空间内的角,面积/半径平方

单位立体角:

对于整个球来说,立体角为:

使用立体角可以代表从秋心发出的光线的方向。
Intensity就是光源在任何方向的亮度。将每个立体角方向的randiant Intensity积分得到radiant flux。

猜你喜欢

转载自blog.csdn.net/almost_afei/article/details/111998333