用于光线跟踪的SAH-KD树设计方法与流程

文档序号:14715954发布日期:2018-06-16 01:21阅读:395来源:国知局
用于光线跟踪的SAH-KD树设计方法与流程

本发明涉及数据处理技术领域,尤其涉及一种用于光线跟踪的SAH-KD树设计方法。



背景技术:

K维树(KD树)是一类坐标轴对齐的平衡二叉树,是常用于K维空间中进行空间划分的数据结构,被当作加速结构广泛的应用于图形应用与查询领域,比如光线跟踪中三角面集合与光线的相交检测和最近邻查询等。KD树的遍历成本在不同的应用领域有不同的计算方式,在光线跟踪中需要计算出每条光线穿过的KD树所有叶节点。为了达到高效遍历,通常在构建时使用表面积启发式划分法(SAH),通过最小化每个节点上三角面片与光线相交测试复杂度期望选择划分点。

相关技术中,为了快速高效的构造用于光线跟踪的SAH-KD树,一种方法是串行构造方法,最简单的思路是对构造的SAH-KD树的每个节点上所有划分点进行全遍历计算SAH值,其计算复杂度为O(N2),由于计算复杂度较高,使得该方法无法应用于大场景;另一种是并行化构建方法,在上层大节点通过一个高性能线程进行计算,直到每个节点计算量足够小,才将它们分配到多核系统中的构造思路,该方法虽然提高了SAH-KD树的构建效率,但是算法遍历时由于顶层的中值选择效率有些退化,在超大型场景有不同程度的性能损失。

因此,实有必要提供一种新的用于光线跟踪的SAH-KD树设计方法解决上述问题。



技术实现要素:

本发明需要解决的技术问题是提供性能好且效率高的用于光线跟踪的SAH-KD树设计方法。

为解决上述技术问题,本发明提供了一种用于光线跟踪的SAH-KD树设计方法,该方法包括如下步骤:

步骤S1、在进行所述SAH-KD树的构建之前,对节点中的当前根节点的所有三角面片进行预处理,计算所述当前根节点的所有三角面片的包围盒,将所述包围盒在三个维度排列,形成有序包围盒序列;

步骤S2、按层次递归构建所述SAH-KD树,通过遍历上层每个所述节点的所述有序包围盒序列,生成当前所述节点的左、右子节点的有序包围盒序列,并计算出当前层次每个所述节点的包围盒的三个维度的表面积;

步骤S3、根据每个所述节点的所述包围盒求出当前节点需要划分的维度,生成每一层所有所述节点的空间树和候选划分点,利用所述空间树并行计算出每个所述候选划分点对应的SAH值;

步骤S4、对于当前层的每个所述节点,遍历其包含的所述候选划分点,选择最小SAH值对应的所述候选划分点作为当前节点的最优划分点,并将该当前节点分成左、右两个子节点。

优选的,步骤S1中,所述包围盒为AABB包围盒。

优选的,步骤S1中,将所述包围盒在三个维度按升序排列。

优选的,步骤S2中,具体还包括:

迭代计算出每个节点在新的一层空间中的偏移D,使用AssignTri算法将所述左、右子节点包含的所述三角面片有序指派至所述左、右子节点中:

其中,NT为新一层三角面片的总和;NL为左子节点的三角面片数,NR为右子节点的三角面片数,i为自然数;D为偏移。

优选的,步骤S3中,选择所述包围盒最长的维度作为需要划分的维度。

优选的,该方法为CPU/GPU混合编程的SAH-KD树设计方法,利用GPU使用宽度优先搜索构建所述SAH-KD树,所述CPU对每次结果进行同步。

与相关技术相比,本发明的用于光线跟踪的SAH-KD树设计方法为基于CPU/GPU混合编程的SAH-KD树构建方法,先生成一层每个所述节点在三个维度上三角面片包围盒的有序包围盒序列,根据每个所述节点包围盒选择一个维度进行划分,生成所有节点在相应维度下的候选划分点,计算出每个候选划分点的SAH值,并选择每个节点最小SAH值对应的候选划分点为最优划分点。该方法充分利用GPU多核的特性,使用宽度优先搜索(BFS)构建所述SAH-KD树,并在每层构建时基于当前层次所有所述节点的每个划分点来进行并行计算,CPU仅对每次结果进行同步,充分发挥CPU与GPU本身的计算特点,提高构建效率。同时使用所述空间树高效计算所述SAH值,所述空间树可以使每个GPU线程在最坏情况下保持远小于当前节点三角面片数的计算复杂度,从而实现在整体设计构建上达到高性能的目的。

附图说明

图1为本发明用于光线跟踪的SAH-KD树设计方法的流程框图;

图2为本发明用于光线跟踪的SAH-KD树设计方法在Cooper场景下与I.Wald串行算法的层次数量中的时间效率对比曲线图;

图3为本发明设计方法在使用8~64个GPU核心时(以8核为基准)在四种场景下与对比算法的性能加速比曲线图;

图4为通过本发明的设计方法在场景Toys、Bunny、Dragon和Cooper时分别生成的效果图。

具体实施方式

下面将结合附图和实施方式对本发明作进一步说明。

本发明提供了一种用于光线跟踪的SAH-KD树设计方法,本发明的用于光线跟踪的SAH-KD树设计方法为CPU/GPU混合编程的SAH-KD树构建方法,充分利用GPU多核的特性,使用宽度优先搜索(BFS)构建所述SAH-KD树,并在每层构建时基于当前层次所有节点的每个候选划分点来进行并行计算,所述CPU仅对每次结果进行同步,充分发挥CPU与GPU本身的计算特,提高构建效率。同时用空间树高效计算SAH值,空间树可以使每个GPU线程在最坏情况下保持远小于当前节点三角面片数的计算复杂度,从而实现整体构建上达到较高的性能的目的。

请参阅图1,为本发明用于光线跟踪的SAH-KD树设计方法的流程框图。该方法包括如下步骤:

步骤S1、在进行所述SAH-KD树的构建之前,对节点中的当前根节点的所有三角面片进行预处理,计算所述当前根节点的所有三角面片的包围盒,将所述包围盒在三个维度排列,形成有序包围盒序列(或有序序列)。

具体的,三角面片的包围盒方式有多种,如最小包围球、方向包围盒OBB以及固定方向凸包FDH等。本实施方式中,作为计算性能与查询性能的折中,所述包围盒为AABB包围盒。

本实施方式中,将所述包围盒在三个维度按升序排列,当然不限于此。

步骤S2、按层次递归构建所述SAH-KD树,通过遍历上层每个所述节点的所述有序包围盒序列,生成当前所述节点的左、右子节点的有序包围盒序列,并计算出当前层次每个所述节点的包围盒的三个维度的表面积。

由于所述SAH-KD树只在叶节点保存三角面片,需要把父节点中的三角面片指派到每个所述节点的左、右两个子节点中。在并行计算出所有的SAH值后,使用CPU进行同步,顺序找出每个节点最小的SAH值对应的划分点,以及其左右子节点包含的三角面片数NL和NR。而一次处理所述SAH-KD树一层的所有所述节点,需要一次性对所有所述节点产生的新子节点分配空间。新一层三角面片的总和为:

其中,NT为新一层三角面片的总和;NL为左子节点的三角面片数,NR为右子节点的三角面片数,i为自然数。

之后依次在三个维度遍历每一个所述节点的所有三角面片,并按照每一个所述节点的实际左、右子节点的归属依次加入到新分配的空间中。具体做法是先迭代计算出每个所述节点在新的一层空间中的偏移D,之后使用算法AssignTri将三角面片有序指派到其左、右子节点中:

由于其父节点是有序序列,所以得到的子节点也是有序序列,从而省略了排序的步骤,直接进行下一层候选划分计算。

步骤S3、根据每个所述节点的所述包围盒求出当前节点需要划分的维度,生成每一层所有所述节点的空间树和候选划分点,利用所述空间树并行计算出每个所述候选划分点对应的SAH值。

计算所述候选划分点的SAH值主要目的是为每个所述节点选出最优的划分点。由于平面空间中有三个维度,而所述SAH-KD树每次只选择一个维度进行划分,所以先要找出要进行划分的维度。为了简便计算,通常对当前所述节点包围盒进行分析,本实施方式中,选择所述包围盒最长的维度作为要划分的维度。

计算每个所述候选划分点的SAH值时需要计算所述候选划分点左、右两侧三角面片数量,本发明的设计方法通过所述空间树来加速这一过程。所述空间树通过有序包围盒序列构造,所述有序包围盒序列可以看成一棵平衡二叉树,而让你述空间树是对平衡二叉树加入一个副值来加速搜索的速度。

以划分X轴为例,在X轴上包围盒有两个坐标值Xleft和Xright,分别用来代表所述包围盒左、右两端,此时加入一个辅助值T,其定义为:

若该节点是叶节点,T定义为Xright

若该节点是非叶节点,T定义为两个子节点的T值与其本身Xright的最大值。

显然T值需要后序自底向上遍历,使用有序包围盒序列求出所有节点T值的算法BuildT为:

调用BuildT时使用的l和r分别为0和序列spacetree的长度。计算出所述空间树后,每个候选划分点都需要遍历相应节点的空间树求出其对应的SAH值,主要复杂度在计算NL、NR和NP,其中,NL、NR分别为完全位于所述候选划分点左、右两侧的三角面片数;NP为被所述候选划分点穿过的三角面片数。对于每个候选划分点的坐标pos,对空间树进行遍历具体如下:

若当前节点的T值小于pos,则从left到当前节点都在候选划分点的左边,将NL加上当前区间三角面片的个数,并遍历其右子节点;

若当前节点的Xmin大于pos,则位于该节点右边的节点都在候选划分点的右边,将NR置为当前节点序号,并遍历其左子节点;

否则判断当前节点的三角面片包围盒与pos的位置关系,相应的修改NL和NP,并遍历其左右子节点,之后根据所述包围盒的三个维度的表面积SX,SY和SZ计算出SAH值。算法CalSAH为:

步骤S4、对于当前层的每个所述节点,遍历其包含的所述候选划分点,选择最小SAH值对应的所述候选划分点作为当前节点的最优划分点,并将该当前节点分成左、右两个子节点。

本发明的上述设计方法的优点包括:

一、按层级计算每一层上节点的最优划分点。

按层级计算可以使分配内存的次数以及GPU与CPU的交互次数只与层数有关,并且可以使用连续内存空间进行层次遍历,而不需要使用队列的辅助。在进行同步操作时,只需要遍历一次上层节点就能得到下层节点的有序候选序列,避免了多次遍历。

二、使用基于空间树的快速计数方法。

空间树是一种带副值的平衡二叉树,根据主值执行插入和删除操作,使用幅值辅助查询,该数据结构广泛用于对同一集合的多次范围查找。使用空间树每个GPU核心可以根据快速计算出候选划分点对应的NL、NR和NP,其计算复杂度和候选划分点穿过的三角面片数量有关,考虑实际场景,这个值总是远远小于总的三角面片数,使得计算速度大大提高。

另外,本发明的设计方法的复杂度从三个方面进行分析:

1、KD树(SAH-KD树)构造前,需要先对三角面片包围盒在三个维度进行排序,其复杂度是O(NlogN)。

2、在KD树构造期间,对于每一个非根节点,CPU端首先需要构造出三个维度的顺序序列和节点的包围盒。节点包围盒可以根据最优划分点在O(1)的时间得出,将三角面片顺序划分至新的节点中,需要在三个维度上遍历所有三角面片一次,复杂度为O(N)。在得出有序的三角面片后,层次递归每个节点的包围盒序列构造该序列的空间树结构,每一层总的复杂度为O(N)。在GPU端,根据空间树的特性,需要搜索每个区间,如果区间内所有三角面片都在划分点的同一侧,则停止搜索该区间。所以只有该区间包括了被划分点穿过的三角面片时,空间树才会在该区间的二分子区间中去搜索。

又因为KD树的层高不会超过(logN),于是每次算法CalSAH的复杂度最复杂情况下不会超过O(NP+logN)。其中NP是该候选平面穿过的三角面片数,正常场景中无论NP还是logN都是远远小于N的值。

3、整体结合而言,每一层复杂度为O(N+NP+logN),而KD树的高度为(logN),因此该构造方法复杂度仍为O(NlogN)。由于CPU端的任务主要是指派三角面片与空间树构建,而不涉及任何浮点数计算,所以计算效率很高。处理中排序对算法性能影响很大,考虑到真实场景中一般都会有一个初始状态,我们可以基于该状态下提前离线进行预排序,从而节省初始的排序计算量。

本发明的用于光线跟踪的SAH-KD树设计方法提供一具体实例验证其有效性,具体如下:

使用统一计算设备架构(Compute Unified Device Architecture:CUDA)框架实现本文提出的算法。算法运行平台为:四核八线程INTEL酷睿E3处理器,GPU型号为GTX750Ti。测试数据为Toys、Bunny、Dragon、Cooper等几个常用的场景,上述场景包含的三角面片的数量从11K到1M不等。在最多64个GPU核心下本发明的设计方法与三种算法进行比较,分别是:I.Wald提出的串行算法、Physically Based Rendering(PBRT)中KD树实现方法、以及不使用空间树的朴素的GPU编程算法做对比,算法时间(并行算法64GPU核心)比较如表1所示:

表1不同场景下本文方法与对比算法时间效率比较

由上述表1结果表明,本发明的设计方法构造时间在各个场景都优于其他算法,其主要原因是:本发明设计方法是对三角面片进行排序,而不是候选划分点,使得需要排序的序列长度从2N减少到了N,在计算上又通过高并行度的SAH值计算算法处理,虽然算法均摊下来不如I.Wald方法中O(1)简单,但从每个计算核心来看本文算法复杂度为O(NP+logN)优于I.Wald方法O(N)的复杂度;朴素GPU算法虽然不需要进行预排序,但每个GPU核心都需要对所有三角面片进行相交测试,时间复杂度为O(N),也是远高于本文算法复杂度;PBRT中的算法复杂度是O(Nlog2N),因此时间消耗最大。此外,每次划分求出的SAH值是KD树性能的重要指标,但由于四种方法都是通过寻找最优候选划分点,所以求出来的SAH值基本相同,并不存在遍历性能上的差别。

在具体的场景中,场景Toys的处理结果表明,在小场景下,本发明的设计方法与高效的串行算法差距并不大,主要原因是本发明的设计方法中指派三角面片是在CPU中完成,而少量的浮点数计算不会明显影响串行算法的计算时间。朴素GPU算法不需要最开始的预排序,且在小场景下空间树的效果并不明显,最终两者的结果相近。

其他三个场景中随着三角面片数量的增加,本发明设计方法中达到4-6倍于串行算法的时间效率,且随着三角面片数变大稳步增加。串行算法在每层构建时通常需要O(N)级别的浮点数计算,当数据量大时计算量远超过条件判断并且越来越明显。空间树的效果也在大场景中体现出来,对比于朴素GPU算法,由于条件判断较多消耗了大量GPU核心的计算能力,而空间树可以大大降低这一过程,代价仅需在CPU端对有序的三角面片进行一次遍历。

在构建SAH-KD树过程中,随着层次的加深,每个节点所包含的三角面片数越少,但遍历时需要更多的相交测试才能达到叶节点,为了平衡这一现象,在实际应用中都会制定相应的早停策略。

请参阅图2,为Cooper场景下I.Wald串行算法与本文算法在场景层次数量中的时间效率对比曲线图。图2中列出Cooper场景下SAH-KD树计算1~7层时,计算得到的算法时间效率,具体通过如下公式:

其中Tn为计算到第n层所用的时间,Tarr为排序所用的时间。可以看出I.Wald串行算法的时间消耗随着层数上升显著提高。虽然每层计算后被划分点穿过的三角面片会被复制一份,但是本发明的设计方法中这些计算量会被平摊到每个GPU核心中,并不会明显影响计算速度,从图2可以看出算法耗时基本和层次数量成线性关系。

请参阅图3,为本发明设计方法在使用8~64个GPU核心时(以8核为基准)在四种场景下与对比算法的性能加速比曲线图。GPU核心数对并行算法的影响也非常重要,图3可以看出本发明设计方法随着核心数的增长,加速比基本和倍率成正比关系,能够充分利用GPU的多核架构,并且随着场景的增大,越可以有效的利用多核性能。

请参合图4,其中图4(a)、4(b)、4(c)、4(d)为通过本发明的设计方法在场景Toys、Bunny、Dragon和Cooper时分别生成的效果图。

在小场景Toys中,64核与8核的加速比为5倍左右,而在较大的场景Cooper中达到了7.5倍左右的性能。由于本发明设计方法在内存分配与三角面片的指派每层只在CPU中进行一次,所以不会给算法性能带来负担,同时由于较高的负载均衡度,使得本发明设计方法可以高效率的利用GPU核心。而当前基于节点的并行算法,不但无法达到高的并行度,而且节点大小不一,每个线程的负载也不均衡,最终无法达到理想的加速效果。

与相关技术相比,本发明的用于光线跟踪的SAH-KD树设计方法为基于CPU/GPU混合编程的SAH-KD树构建方法,先生成一层每个所述节点在三个维度上三角面片包围盒的有序包围盒序列,根据每个所述节点包围盒选择一个维度进行划分,生成所有节点在相应维度下的候选划分点,计算出每个候选划分点的SAH值,并选择每个节点最小SAH值对应的候选划分点为最优划分点。该方法充分利用GPU多核的特性,使用宽度优先搜索(BFS)构建所述SAH-KD树,并在每层构建时基于当前层次所有所述节点的每个划分点来进行并行计算,CPU仅对每次结果进行同步,充分发挥CPU与GPU本身的计算特点,提高构建效率。同时使用所述空间树高效计算所述SAH值,所述空间树可以使每个GPU线程在最坏情况下保持远小于当前节点三角面片数的计算复杂度,从而实现在整体设计构建上达到高性能的目的。

以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1