光线追踪算法的GPU加速算法(学习版)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加速构建KD树的方法
(声明:本文仅为笔者的相关整理和理解)
摘要:光线追踪算法是用来生成照片逼真的渲染效果最有前途的算法之一。

然而,算法的计算开销使算法远达不到实时显示效果。

许多学者提出了不同的改进,不断加速光线追踪算法。

在本文中,我们将介绍一些的改进方法的关键步骤,例如GPU构建kd树,和专用硬件加速引擎。

关键词:KD树光线追踪 GPU 硬件
A Method Of Accelerating
The Construction Of KD-Tree
Abstract: The ray tracing algorithm is one of the most promising algorithms, which is used to generate photo realistic rendering effects. However, the expense cost of computing puts the real time ray tracing far from reaching. Many scientists come up with different improvements to stand closer to, real time ray tracing, the terminal goal. In this paper, we will introduce some key points of certain outstanding improvements, such as, constructing the KD tree on GPU, and dedicated hardware acceleration engine. Key words: KD Tree ray tracing GPU hardware
一、简介
光线追踪算法在真实感填充方面的效果非常出色,考虑了不同方向反射光线与折射光线对空间特定点亮度的影响,通过多次的迭代达到真实的效果。

然而多次迭代跟踪反射光线与折射光线带来的结果就是三维空间中要进行大量的求交点运算,特别现在提倡的高清的时代,在2560*1440的区域上进行光线追踪算法,每秒几乎要发射出20亿条光线。

有学者提出区域分割、八叉树、KD树等方法来快速计算光线与物体表面交点。

区域分割是将整个空间划分成为相等大小的子区域,如果某个子区域内有实体,就标记该区域为有实体。

八叉树是在空间划分上进行的一个改进,空间不是被等分,而是将实体使用大小不同的正方体来表示实体,算法中大小相邻的正方形空间之间大小比例是8:1。

KD树可以看作是八叉树的一种改进,KD在划分子空间的时候总是选取散度最大的坐标轴方向,使得空间划分更有效。

所以KD树是使用最广泛,并被认为是最有前景的方法。

在加速构建KD树的领域,研究人员也做出了许多探索,部分小组成功的把构建KD树的算法移植到4核的CPU上运行。

所以在并行计算能力非常强大的GPU上实现KD树构建算法成了很热的一个方向,与此同时,部分研究人员把目光转向专用硬件芯片FPGA,并取得了很好的成绩。

本文的结构是这样安排的:我们在第二本分介绍传统的序列SAH KD树的构建方法;在随后的第三部分介绍并行化计算SAH代价和排序的算法;在第四部分介绍现已有的硬件专用芯片;第五部分是实验结果的展示;最后是对本文的总结。

二、序列SAH KD树的构建
在构建KD树之前,我们要提前构建三个事件列表,分别对应三个坐标轴。

对于每一个轴对齐包围盒(AABB),在某一坐标轴上有两种事件:开始事件定义为轴对齐包围盒在坐标轴方向的最小值;结束事件定义为轴对齐包围盒在坐标轴方向的最大值。

算法计算三个坐标轴方向的散度,对散度最大的坐标轴方向进行空间划分,在确定分割平面的时候,通常是要最小化SAH代价来确定最优分割平面,SAH代价需要计算候选分割平面两侧周对齐包围盒的数目然,两侧三角形的面积和。

确定候选分割平面两侧三角形的数量可以通过
计数平面某一侧开始事件或结束事件的数目来完成。

例如计数候选分割平面左侧三角形的数量,可以通过计数候选分割平面左侧开始事件的数目。

如果候选分割平面穿过某个三角形,那么这个三角形既属于左侧三角形有属于右侧三角形。

在确定最优分割平面之后,子空间会进一步被分割,为了使子空间仍然能被细分,需要对得到的子空间的图元进行排序,构建子空间的事件列表。

三、GPU构建SAH KD树
在上一部分讲到,计算SAH代价的时候,很重要的一步就是确定候选分割平面两侧三角形的数目。

因为事件列表已经提前构建存储,所以能够使用并行数据图元扫描的方法并行计算三角形的数目,其中图1展示了如何具体实现,其中关键词PARALLEL表示产生大量线程。

在算法中,最有可能的分割平面往往在三角形轴对齐包围盒的表面为了便于计算,我们使用标志暂时表示开始事件与结束事件,如图2,我们用1表示开始事件,用0表示结束事件。

这样就能通过扫描标志列表来计算三角形的数目。

标志列表的前项和就是开始事件的数目,因为开始事件数目与结束事件数目之间是相关的,可以通过算法3展示的伪码算得结束事件的数目。

图1 并行计算最优平面算法
图2 计算三角形数目
确定分割平面之后,我们可以将原先的三
角形放入到子节点上,完全位于分割面一侧的三角形保持不变,对于被分割平面穿过的三角形,需要分裂轴对称包裹盒,分裂操作能够极大的提升KD树的质量和光线追踪的表现。

最简单的方法是将子节点的三角形重新构建事件列表,然而这样效率很低。

为了优化构建子节点的事件列表,我们将事件分为E
only
事件
与E
both
事件两类。

E
only
事件表示三角形位于分割平面一侧,只用从原先的事件列表中继承,
而E
both
事件择不会。

首先选出所有的E
both
事件,
随后将其与E
only
事件融合成为新的事件列表,如图3所示。

然而这个过程在GPU中的表现并不是很好。

图3 重新排序子节点事件
四、现有的专用芯片
现在我们介绍的专用硬件芯片的主要架构在下页图4中完整介绍其中的主要部分将在以下部分重点介绍:
A .场景边界计算单元(SBCU )
场景边界计算单元以8个32比特浮点数作为输入,通过比较当前值与已存最大值最小值比较,更新上边界与下边界。

这里使用两个场景边界计算单元并行计算上边界与下边界。

B .前项和单元(PSU ) 在前一部分介绍道,计算分割平面两侧开始事件和结束事件可以通过计算前项和实现。

前项和单元是重复使用率很高的一个部分。

它将很长的序列分割成很小的部分,并行地在每一个小的部分上进行前项和计算,最后将所得部分整合成为完整的序列。

图5展示出了32位的前项和单元。

图5 计算8项前缀和
C .莫顿码生成单元(MCGU )
莫顿码生成单元用来产生莫顿码,并在需要的情况下复制三角形。

D .基筛选单元(RSU )
E .叶结点生成单元(LNGU )
F .内部节点生成单元(INGU )与位编码器(BEU )
G .路径压缩单元(PCU )
路径压缩单元使用节点莫顿码的值计算在压缩KD 树上节点的双亲节点。

H .片上缓存
算法需要16KB 的片上缓存来标记节点是否是必要的。

图 4 硬件架构
表1 各种方法的计算开销
五、实验结果
上述硬件专用芯片不仅能保证近似实时并且效果非常逼真。

渲染效果在图6展示,并且算法的计算速度与其他方法的计算速度在表1列出
图6 渲染效果
六、总结
在众多的改进算法中,已经实现简单场景实时光线追踪。

特别是在加速构建KD树方面的改进,光线追踪的效果和效率都得到了保障,在高速GPU并行运算和专用硬件的加速下,基于构建KD树的光线追踪算法有很好的使用前景。

参考文献:
[1] Ni, and Z. Li, “Fast-tree: a hardware kd-tree construction acceleration engine for real-time ray tracing”, Design, Automation & Test in Europe, 2015:1595-1598
[2] Z Ma,Z Li, “The Real-Time and Realistic Rendering for 3D Sea Terrain Based on Electronic Chart”, International Conference on Virtual Reality and Visualization (ICVRV) 2015:160-165
[3] Zhefeng Wu , Fukai Zhao , Xinguo Liu, “SAH KD-tree construction on GPU” - Acm
Siggraph/eurographics Conference on High Performance Graphics - 2011。

相关文档
最新文档