课堂笔记_ 光线跟踪加速

光线跟踪算法的不足:
光线跟踪算法的时间和空间复杂度很高;
大量的时间被消耗在可见性判断和求交测试这些几何运算上。

光线跟踪加速

采用空间数据结构:
–层次包围体(Hierarchical Bounding Volumes);
–均匀格点(Uniform Grids)
–四叉树/八叉树(Quad tree/Octree)
–空间二分树(K-d tree/BSP tree)
–其他加速技术
使用好的空间数据结构可以使得光线跟踪算法加速10-100倍。

包围体———————————————————————————–

先和包围体相交测试,根据是否相交再进一步确定。
1.AABB(Axis-Aligned Bounding Box):包围盒的三组棱边分别平行于世界坐标的xyz轴。

2.OBB(Non-Axis Bounding Box):也称为有向包围盒。
OBB是比AABB更优的解,其匹配程度往往比AABB更高。通常会使用较复杂的优化算法通过迭代来计算OBB,作为最优包围盒的一个近似。

层次包围体—————————————————————————–

包围体的局限性:
假设有n个物体,每个物体使用一个单独的包围体,那么光线与所有物体的相交检验至少仍然需要O(n)的时间复杂度。

包围体的一个自然扩展就是使用层次结构来进行分层细分,也就是层次包围体:Hierarchical Bounding Volume(HBV)。利用树状结构管理,时间复杂度降到O(logn)

均匀格点——————————————————————————–

将场景分成均匀的网格,对每一个格点,将所有与其相交的面片记录下来,存储为一个列表,当光线与小网格中面片相交时,则求对应的交点,不经过的就不用求。与DDA算法原理(直线的光栅化)类似,增量的思想。

将其推广到三维来计算,3DDDA。

优点:容易构建、容易遍历;
缺点:当场景不均匀时,使用均匀格点并不是一个好的选择,因为大部分的多边形实际上都位于较小的一部分空间当中。
使用多少格点?(均匀格点尺度的问题)
太少->每个格点中存储的面片太多->运算变慢;
太多->需要遍历许多空的格点->慢且需要大量内存。
所以:非均匀的空间划分是更好的选择

八叉树(Octree)———————————————————————

四叉树(Quad tree)

二叉树的二维推广,每个节点是一个正方行,递归地将每个正方形分成四个等大小正方形,当叶节点中的内容(面片数)足够简单时,停止递归。

八叉树(Octree)

四叉树的三维推广,递归地分成八个小立方体。八叉树的遍历比均匀格点要复杂,但是八叉树能够更好地适应非均匀的场景。

八叉树的构建:

首先,将整个场景用一个最小的平行于坐标轴放置的立方体包围起来;
使用由顶至下的递归方式不断地将立方体划分为更小的立方体,直到满足一定的终止条件;
终止条件可以包括:达到了某个预先设定的最大递归深度,或是节点中所包含的基本面片数目已经很少,等等。

可能存在的问题:注意到,面片总是被存储在八叉树的叶节点上;同一个面片有可能被不同的叶节点同时存储(例如,在某个立方体中心附近的一个面片)。这种重复存储会一定程度上影响效率,一种可行的方法是使用八叉树的变种Octree-R解决。

Octree-ROctree的区别在于:Octree只能从立方体的中心做三个平面将其划分成8个,而Octree-R的划分平面更加自由。使用巧妙的启发式算法可以为三个方向的划分平面确定其放置位置。Octree-R通常能使Octree提速4%-47%。具体提速多少取决于场景中物体的分布情况。

八叉树的子节点寻址

法1:直接使用指针:八叉树的每个内部节点存放有八个指针指向其子节点,太麻烦了。
法2:对八叉树的每个节点,其八个子节点的编号使用该节点的编号加上1至8作为其后缀得到,如下图:
八叉树

八叉树的遍历

光线在八叉树中的遍历算法要比在均匀网格以及BSP树种遍历都更为复杂。光线每与八叉树的一个内部节点相交,都有可能与其至多四个子节点相交,而这些子节点的顺序要比BSP树的情况更为复杂。

空间八叉树剖分技术
八叉树的最大深度表示空间分割所达到的层次,称为空间分辨率
八叉树的深度为N,八叉树终结节点的编码正好是 q1q2...qiFF...F , q1,...qn0,1,2...7 ,i在 [0...N] 之间,F为异于0,1…7的符号。此处F是为了保持每层的编码长度相同;
由八叉树节点编码方式很容易找到空间任一点所在的空间网格单元

给定空间的一点坐标,已知该点肯定落在某个立方体中,而这个立方体的编码为 q1q2...qi 。空间点坐标的xyz分别写成二进制,对这些二进制位按一定方法运算后形成对应的编码
编码序列
反过来,给定一个编码,就可以确定空间网格的坐标。
八叉树性质
性质A和性质B是八叉树中两条根本性质,特殊的编码方法在x方向加1,y方向加2,z方向加4,正好得到编码这个性质。

光线跟踪过程(结合八叉树)

第一个(当前)相交网格判断:
Step1.先利用性质A求光线起点 p0 所在单位立方体网格的八叉树编码Q;
Step2.位于立方体边界上的起点要根据光线前进方向R判别光线是否已射出场景。若光线已射出场景,则算法结束;
Step3.Q的空间线性八叉树节点表查找结果:查找是否成功的布尔量T以及未获匹配位数B:

1.设Q为 q1q2...qn ,那么在八叉树中含结点 q1q2...qiFF...F 时,T取真值;

2.未获匹配位数B定义为八叉树节点表中与Q获得最大程度匹配节点其编码尾部不匹配的位数,也就是算出编码对应的存储叶节点以后,八叉树可能没有往下分到叶节点,那么编码包含在八叉树内部也是可以的。F即表示没有往下分,所以上面的B为N-i;

3.T决定当前立方体是否包含景物面片,而Q和B确定当前立方体的空间位置和大小。

开始算下一个网格的位置:
新的网格前左下角坐标由性质B确定;

跨越一空间网格后,先求出当前网格上的出口点坐标,重置光线起点:
-光线和六个面求交;
-预先计算光线在各坐标平面上投影线的截距和斜率,快速求解;

以新出发点重复跟踪过程,直至光线射出场景或求到交点为止。

空间二分树(BSP Tree:Binary Space Partition Tree)————————-

BSP树是一种空间划分结构,可以用来解决大量的几何问题。BSP树最初是被用于解决图形学中的隐藏表面问题;它是二分查找树的高维推广,主要有两种类型:axis-aligned类型和polygon-aligned类型

Polygon-aligned BSP树

每次选取一个多边形面片所在的平面,作为空间的划分平面,通常来说,当场景仅由多边形组成时,才会使用Polygon-aligned BSP树,因此有一定的局限性。

Axis-aligned BSP树

划分平面总是和某个坐标轴呈垂直方向,划分平面的正交性极大地简化了光线与划分平面的求交运算,计算光线与一个Axis-aligned划分平面的交所需要的计算量是计算光线与一个任意位置的划分平面的交的计算量的大约三分之一。其构建过程与八叉树类似。

Kd树和BSP树的区别:
Kd树和BSP树的区别主要体现在划分平面的位置选取上。从概念上来说Kd树和BSP树是基本一致的,唯一的不同时:BSP树要求划分平面将节点划分为两个相等大小的子节点;而Kd树的划分平面位置可以任意放置,所以,任何一颗BSP树都是一颗Kd树,但反过来则不成立

光线在BSP树中的遍历过程:
首先判断根节点,根节点就是一个平面,如果光线从平面的左侧(任意位置切开平面)射入,则右侧的平面都不用管理;再往下一个节点有一个子节点,子节点又是一个平面,再判断光线是从该子节点的哪一侧过来,往下直到碰到叶节点,说明这个子空间中物体不多了,这时候就和这些较少的物体先求交。

通常,光线在BSP树中的遍历要比在八叉树中的遍历快大约10%;另外由于BSP树总是从中点处进行划分,因此一个物体(面片)有可能会跨越BSP的多个节点,从而使得相交检测的效率变慢。类似使用Octree-R代替Octree的思想,Kd树可以有效地解决这一问题。

其他技术——————————————————————————-

分布式光线跟踪(Distributed Ray Tracing):

传统的光线投射到物体上会反射出一条光线,但是物体不可能是理想的,就是光线由于存在漫反射,在射出的时候可能有多条。在一点处发射多条光线,可以做很多复杂效果,这就是分布式光线跟踪。

可以产生一系列视觉效果:
光照明:全局光照、软阴影
像素:反锯齿效果
焦距:景深效果(Depth-of-field)
BRDF:模糊镜面反射效果(Glossy-reflection)
时间轴:运动模糊(Motion-blur),在光线跟踪的时候按时间间隔发一些光线,叠加起来让其模糊。

光束跟踪(Beam Tracing):

当前光线和相邻光线很接近,它在场景中的表现和相邻光线应该近似,因此没有必要重复求交。是不是可以将这些光线放在一起,形成光束来求交。另外要知道这个是很困难的。

分布式光线追踪

Heckbert和Hanrahan通过光束跟踪来利用光线之间的空间连贯性,提高光线跟踪(ACM SIGGRAPH 1984):正常情况下光线打在物体上,应该有反射再去和其他物体求交,那么一束光线的反射光束不好判断。这个文章最大的创新之处就在于光线不变,继续往下走,而对于物体反射光线,物体对称过去为上图中的P。但折射的情况复杂多了,需要推导折射变换。往后继续追踪的过程和经典光线追踪差不多。

选点采样:选取需要跟踪的像素,其他点插值,但是会丢失高频信息

RPU:光线跟踪作成硬件后,可编程

RPU:一个用于实时光线跟踪的可编程光线处理单元(Ray Processing Unit),就是将光线跟踪做成了硬件。

RPU是一个完全可编程的光线跟踪硬件,包含对材质、几何、以及光照的编程(ACM SIGGRAPH 2005

以上就是用空间数据结构加速光线跟踪的几种方法。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tingzhushaohua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值