光线追踪2
一、使用包围盒加速光线追踪
(1)先将目标场景分为多个包围盒,并把与物体重叠的包围盒记录下来。
(2)判定光线与包围盒的相交情况
①找到光线与场景中每个相交的包围盒,查看它们是否是记录的与物体重叠的包围盒。
②判断光线与包围盒中的所有物体的相交情况。
③小技巧:如果光线沿着右上方向投射,如果光线穿过当前盒子,下一个相交的盒子只需要查看该盒子的右边盒子与上方盒子即可。其余方向同理。
(3)不同包围盒数量与其加速情况
①如果只有一个包围盒,那么没有加速效果。
②如果包围盒很多,那么会降低效率。
③创建的包围盒数量需要有一个权衡。
二、空间划分(Spatial Partitions)
(1)下面是三种空间划分的方法:
①Oct-Tree为八叉树,对于每个需要划分的空间,都将其划成八块,如果子空间划分完后只有少量块里有物体,那么就不再划分,否则再将子空间也划成八块。
②KD-Tree对于每个需要划分的空间,都沿着轴划一刀分成比较均匀的两部分,如此往复。
③BSP-Tree对于每个需要划分的空间,可以从任意方向划一刀分成比较均匀的两部分,如此往复。
三、KD-Tree
(1)下面是使用KD-Tree的一个划分以及存储例子。
①非叶子结点存储划分的轴等相关信息,不存储物体信息。
②叶子结点存储包围盒内的物体信息。
(2)使用KD-Tree划分进行光线追踪的例子
①光线首先与区域A相交,然后判断光线与A的两个子节点判断是否有交点。如果有交点,则继续往下判断。
②当遇到叶子结点,如果光线与叶子结点1的包围盒相交时,则光线与1内所有的物体都进行相交判定,发现光线不予1内任何物体相交。
③光线与叶子结点3的包围盒相交时,接着将光线与3内所有的物体都进行相交判定,发现光线与其中一个物体存在交点。
④如此循环直到遍历完整个KD-Tree。
(3)KD-Tree的缺点:
①KD-Tree的建立需要判断场景内所划分的包围盒与物体的相交情况,这样是比较困难的。
②KD-Tree是按空间划分的,那么如果一个物体被多个包围盒分割,它就必须存储到多个包围盒里。
四、Bounding Volume Hierarchy(BVH)
(1)Bounding Volume Hierarchy是一种物体划分方法,该方法是目前图形学中常用的方法。
①BVH将当前空间按照物体分成两部分。
②BVH尽可能使两边的物体数量保持平衡。
③BVH中,每个物体只存在一个包围盒中。
(2)BVH的划分技巧
①每次沿着最长的轴划分。
②如果该空间内有n个物体,那么沿着第n/2个物体进行划分,这样可以是两边的物体数量平衡。(可以使用快速划分算法来找到第n/2个物体)
③当空间内的物体较少时停止划分(例如5个)。
(3)BVH的存储
①BVH的存储方法与KD-Tree类似。
(4)光线与BVH划分求交点的伪代码
①是一个递归算法。
(5)空间划分与物体划分的特点总结
五、辐射度量学(Basic radiometry)
(1)之前所学的Blinn-Phong模型是一个简化的模型,辐射度量学可以让我们获得更精确的光线追踪结果。辐射度量学可以提供物理上正确计算光照的方法。
(2)一些概念
①Radiant Energy:能量,单位为焦耳J=Joule。
②Radiant Flux(Power):单位时间的能量,单位为瓦特W=Watt(或者流明lm=lumen)。
(3)光的度量
①Radiant Intensity:光源会往四面八方都辐射能量。
②Irradiance:物体表面一个点会从四面八方接受能量。
③Radiance:光线传播的能量度量。
(4)弧度制
①在平面中,我们会使用弧度制来度量平面角的大小。平面中,弧度是指弧长和半径的比例,一个圆的弧长为2π。
②立体角是平面角在三维空间中的推广。将平面的弧度制推广到三维空间为球面度,球面度是指球上的面积与半径平方的比例,一个球的球面度为4π。
③给定θ和φ可以得到其对应的球面面积。
(5)Radiant Intensity
①Radiant Intensity是指光源每个单位立体角的能量。
②如果一个光源向周围均匀辐射能量,那么它在每个单位立体角的能量为它的总能量/4π。
参考文献
课程视频链接: GAMES101 Lecture14 Ray Tracing 2