目录
1 用AABB 包围盒加速光线追踪(Axis-Aligned Bounding Box)
1.2.2 KD-Tree预处理(KD-Tree Pre-Processing)
1.3 物体分区(Object Partitions & Bounding Volume Hierarchy (BVH))
1.3.3 BVH的存储结构(Data Structure for BVHs)
2.1 Radiant Energy and Flux (Power)
2.2.1 Angles and Solid Angles(角和立体角)
2.2.2 Differential Solid Angles(微分/单位立体角)
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 flux,intensity, 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