Bootstrap

【GAMES101笔记速查——Lecture 14 Ray Tracing2】

目录

1 用AABB 包围盒加速光线追踪(Axis-Aligned Bounding Box)

1.1 均匀网格(Uniform grids)

1.1.1 建立均匀的加速网过程:

        (1)定义包围盒

        (2)划分均匀网格

        (3)确定与物体表面相交的盒子有哪些

        (4)遍历光线经过的网格

1.1.2 网格分辨率如何影响加速效果

1.2 空间分区(Spatial partitions)

1.2.1 空间划分方法

1.2.2 KD-Tree预处理(KD-Tree Pre-Processing)

(1)KD-Tree的划分过程

(2)KD-Tree的数据结构

(3)KD-Tree的加速过程

(4)KD-Tree存在的问题

1.3 物体分区(Object Partitions & Bounding Volume Hierarchy (BVH))

1.3.1 BVH划分过程

1.3.2 BVH的优点和问题

1.3.3 BVH的存储结构(Data Structure for BVHs)

1.3.4 BVH算法伪代码

1.4 空间划分vs物体划分

2 Basic radiometry (辐射度量学)

2.1 Radiant Energy and Flux (Power)

2.2 Radiant Intensity(辐射强度)

2.2.1 Angles and Solid Angles(角和立体角)

2.2.2 Differential Solid Angles(微分/单位立体角)

2.2.3 Radiant Intensity实际例子


1 用AABB 包围盒加速光线追踪(Axis-Aligned Bounding Box)

大前提:我们认为光线与盒子求交非常简单,比光线与物体求交简单很多。

1.1 均匀网格(Uniform grids)

1.1.1 建立均匀的加速网过程:

        (1)定义包围盒

        (2)划分均匀网格

        (3)确定与物体表面相交的盒子有哪些

        (4)遍历光线经过的网格

(最简单的方法:直线光栅化的思想,光线只会往某个方向走,比如图中就是向右或者向上),先判断光线与盒子是否有交点,如果有,再判断光线是否与物体求交。

1.1.2 网格分辨率如何影响加速效果

如果只有一个网格:没有加速

网格过多:计算与网格是否相交的次数已经很多,反倒花费了更多的时间。

合适的分割大概是:27 * 包围盒内的物体个数(经验)

均匀网格适合加速的图片:物体在场景的分布比较均匀。比如下面这个图:

物体在场景中分布不均匀,出现大量的空白/物体聚集,比如:

1.2 空间分区(Spatial partitions)

1.2.1 空间划分方法

Oct-Tree 八叉树:平面情况是四叉树、一维情况是二叉树。什么时候停止切割取决于上一次切出来的块中物体的分布情况。

KD-Tree  k维树:每次只切一刀,将空间分为两个区域,水平划分-竖直划分-水平划分······交替进行可以将空间分的相对比较均匀,并且拥有二叉树的性质。

BSP-Tree 二叉空间分区树:可以不是横平竖直切割的。高维的情况不好计算,会越来越复杂。

这里主要介绍KD-Tree,因为它相对来说比较简单而且性质优良。

给定一个场景,在做光线追踪之前,先确定加速结构,再考虑与光线求交的问题。

1.2.2 KD-Tree预处理(KD-Tree Pre-Processing)

(1)KD-Tree的划分过程

(2)KD-Tree的数据结构

内部需要存储的信息:

·分割轴    :每次分割是沿哪个轴分割的x,y还是z?

·分割位置:在哪里进行分割,记录对应的坐标

·指向子节点的指针

·物体信息只存在于 叶子节点,不存在于 中间节点。

(3)KD-Tree的加速过程

光线和某个盒子没有交点:什么都不用做。

光线和某个盒子有交点:可能与其子节点也有交点,继续分别判定。

光线和某个叶子节点有交点:用光线和叶子节点中的所有物体求交。

判断光线和最大的包围盒A有无交点,如果有,继续判定光线与它的子节点是否有交点。

光线与子节点1求交,也有交点,在这个例子中我们认为划分到这里就结束,然后用光线和1中所有的物体求交。

光线与子节点B求交,也有交点,继续判定光线与它的子节点是否有交点。

光线与子节点2求交,也有交点,在这个例子中我们认为划分到这里就结束

光线与子节点C求交,也有交点,继续判定光线与它的子节点是否有交点。

光线与子节点3求交,也有交点,在这个例子中3是叶子节点,我们认为划分到这里就结束,然后用光线和3中所有的物体求交。

······

直到所有的叶子节点都遍历到。

(4)KD-Tree存在的问题

·一个物体可能存在于多个盒子中

·KD-Tree的建立并不简单,需要考虑三角形与盒子的求交问题。

因为这两个问题比较难处理,所以KD-Tree应用的比较少

1.3 物体分区(Object Partitions & Bounding Volume Hierarchy (BVH))

边界体积结构:把物体不断分成两堆,然后重新确定它们的包围盒。

1.3.1 BVH划分过程

1.3.2 BVH的优点和问题

优点:

·BVH避免了对三角形与盒子求交,直接重新为一堆物体确定包围盒(物体坐标的边界很容易知道)即可。

·BVH的一个物体只可能在一个包围盒里面。

缺点:

·BVH并不严格把空间划分开,盒子之间存在交集。

·BVH关于如何划分有很多讲究。

划分节点策略:

·将较长轴划分

·以最中间的物体划分,划分后两部分空间的三角形数量差不多

什么时候终止:

·某个节点只包含很少的几个物体就停止。

1.3.3 BVH的存储结构(Data Structure for BVHs)

中间节点

       ·包围盒

       ·指向子节点的指针

叶子节点

       ·包围盒

       ·所包含的物体

1.3.4 BVH算法伪代码

1.4 空间划分vs物体划分

至此,光线与整个场景的求交就可以在很快的时间内完成了。


2 Basic radiometry (辐射度量学)

我们先观察之前实现的whitted风格着色,这个结果看起来有点假,不像是真实世界存在的物体,许多地方都是做了概括和简化,所以误差很大。

所以我们引入了辐射度量学,辐射度量学可以精确地定义光、物体表面如何和光进行作用,光线的传播方法······高级的光线追踪都是建立在辐射度量学的基础上的。

总的来说,辐射度量学在物理上精确定义了光照

定义光照的四个属性:

Radiant fluxintensity irradiance radiance

题外话:闫神的学习方法,学一个东西先搞清楚Why(为什么要学),再搞清楚what(这个东西是什么),最后再考虑How(这个东西怎么实现)。

2.1 Radiant Energy and Flux (Power)

Radiant Energy:电磁辐射的能量,单位:焦耳(J)。

Radiant Flux(Power):电磁辐射通量,即单位时间的能量,单位:瓦特(W)。在光学中有另外一个单位:流明(lm)。

另一种物理上的理解:通量-在单位时间内流过传感器的光子数

一些重要的光测量量:

2.2 Radiant Intensity(辐射强度)

Radiant Intensity单位立体角上的Power。

什么是单位立体角?

2.2.1 Angles and Solid Angles(角和立体角)

平面上的角可以定义为:弧长除以半径。那么,整个圆对应的角就是2*Π*r ÷ r = 2*Π。

将此定义扩展到三维空间,则空间中的立体角就可以定义为:表面积除以半径的平方。那么,整个球对应的立体角就是4*Π*r^2 ÷ r^2 = 4*Π。

2.2.2 Differential Solid Angles(微分/单位立体角)

整个球对应的立体角求个积分就能算出来,是4*Π

各向同性点光源某一个方向上的power就是intensity,公式如下:

2.2.3 Radiant Intensity实际例子

60w: 外壳标的60w并不是功率真有那么大

而是说这个灯相当于白炽灯的60倍,看上去像是60w的白炽灯。实际它只有11w.

Intensity的计算就是:815 lumen(也就是11w)÷ 4pi = 65 candelas

;