空间求交中的一种高效数据结构及其算法的制作方法

文档序号:6423683阅读:384来源:国知局
专利名称:空间求交中的一种高效数据结构及其算法的制作方法
技术领域
本发明涉及一种数据结构及其算法,尤其是空间求交中的一种高效数据结构及其算法。
背景技术
空间求交算法是图像渲染算法中的核心。为了提高求交速度,往往采用加速结构。其中作为在光线跟踪渲染中广泛使用的一种层次树结构,KD树(K-Dimensional Tree 一种由二叉搜索树推广而来的用于多维检索的树的结构形式,K即为空间的维数)得到了诸多研究者的关注。作为一种基于空间剖分的加速结构,它采用轴对齐的分割面对场景空间进行剖分,递归地生成空间单元间的组织结构。光线跟踪算法中,当光线穿越空间单元时,就借助空间单元间的这种组织关系,跨越空单元来直接找到包含物体的单元,并进行光线与物体的求交测试,然后计算光强进行场景渲染。算法中计算量最大的部分就是光线与物体的求交运算。为提高光线和物体的求交速度,除了 KD树外,常用的加速结构还有 Grids (网格)和BVH(Bounding Volume Hierarchies,层次包围体)等。文献[4]对基于 CPU的光线跟踪算法的加速结构进行比较,认为对于不同类型的测试场景平均而言,KD树是最快的。同时由于光线跟踪有着天然的并行性,为了利用基于SIMD(Single Instruction Multiple Data,单指令多数据)计算平台的GPU (Graphic Process Unit,图形处理单元) 协处理器在并行计算上的优势,将KD树算法移植到GPU上已成为目前的研究热点。KD树算法包括创建和遍历两个过程。好的KD树构建方法能够生成优化的树结构, 从而提高遍历速度。传统上KD树的实现一般基于递归过程或者栈数据结构,但GPU缺少对递归过程的支持且堆栈存取效率低下。因此i^oley等人[5]提出了基于GPU的无栈遍历算法KD-restart。算法中为省去堆栈结构,每次遍历都退回到根节点处重新开始,因此遍历效率低下。斯坦福大学Daniel Reiter Horn等人[6]在此基础上提出了 short-stack遍历算法,采用push-down结构降低额外的节点访问次数,效率高于KD-restart,但仍然需要使用少量堆栈。故,需要一种新的技术方案以解决上述问题。

发明内容
本发明目的是针对现有技术存在的不足,提供一种可提高运算效率的空间求交中的一种高效数据结构及其算法。为实现上述目的,本发明空间求交中的一种高效数据结构可采用如下方案空间求交中的一种高效数据结构,该数据结构用来保存与每个叶子节点六个面相邻的节点,所述叶子节点以及与叶子节点六个面相邻的节点位于一个KD树中。本发明与现有技术相比本发明数据结构用来保存与每个叶子节点六个面相邻的节点,即为每个叶节点保存了六个线索,这样根据光线在当前叶节点的穿出平面沿着线索直接得到后继节点,避免了从根节点或中间节点到叶节点过程中的“远”子节点压栈操作,从而使用本发明所述空间求交中的一种高效数据结构可显著提高运算效率。为实现上述目的,本发明空间求交中的一种高效数据结构的算法可采用如下方案根据所述的空间求交中的一种高效数据结构的算法,设每个叶子节点六个面相邻的节点即为该叶子节点的六个线索,将父亲节点的线索值继承给孩子节点,然后根据父亲节点的分割方式修正孩子节点的两个线索;进行光线遍历跟踪时,遍历时如果光线经过了叶子节点且和此叶子节点中的图元无交点,则根据光线的穿出平面及该穿出平面的线索值得到下一个需遍历的节点。本发明与现有技术相比本发明中数据结构用来保存与每个叶子节点六个面相邻的节点,即为每个叶节点保存了六个线索,进行光线遍历跟踪时,可根据光线在当前叶节点的穿出平面沿着线索直接得到后继节点,避免了从根节点或中间节点到叶节点过程中的 “远”子节点压栈操作,从而使用本发明所述空间求交中的一种高效数据结构的算法可显著提高运算效率。


图1是本发明中节点二维结构与层次关系示意图。
具体实施例方式下面结合附图和具体实施方式
,进一步阐明本发明,应理解下述具体实施方式
仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。本发明公开一种空间求交中的一种高效数据结构及其算法,为了保存线索信息, 在建立KD树时,在节点信息中增加一个数据结构nodebox,用来保存与每个叶子节点六个面相邻的节点(此节点可能是叶节点,也有可能是中间节点),即为每个叶节点保存六个线索。可以先将父亲节点的线索值继承给孩子节点,然后根据父亲节点的分割方式修正孩子节点的两个线索,即左孩子的右线索就是右孩子,如此类推。请参阅图1所示,以节点8为例来说明子节点如何继承父节点的nodebox并进行更新的。根节点1的nodebox = {_1,_1,_1,-1},其分割平面垂直于X轴,子节点2和3首先继承了根节点1的nodebox,然后在X轴方向上更新子节点2和3的nodebox。节点2的 nodebox 更新为{-1,3,-1,-1},节点 3 的 nodebox 更新为{2,-1,-1,-1}。此时,将节点 3 压入栈中。继续对节点2进行分割,其分割平面垂直于Y轴,分为4和5两个子节点。节点 4继承节点2的nodebox,并更新为{-1,3, -1,5};节点5也继承了节点2的nodebox,并更新为{-1,3,4,-1}。然后,将节点5压栈,继续对节点4进行分割,其分割平面垂直于Y轴, 得到子节点8和9。节点8的nodebox先继承节点4的nodebox {-1,3,_1,5},然后更新为 {-1,3,_1,9},节点 9 的 nodebox 也继承节点 4 的 nodebox,并更新为{-1,3,8,5} 光线跟踪中,遍历时如果光线经过了某个叶节点且和此叶节点中的图元无交点, 可根据光线的穿出平面及该面的线索值得到下一个需遍历的节点。由于建树时线索的获得采用了继承的方式,因此此节点与KD树标准遍历算法中的栈顶节点完全相同。现在的关键就是需得到穿出平面,而穿出平面的实质就是最近一次导致分叉状态的分割平面。由于每个节点有六个穿出平面,可用一个三比特的索引值来表示。因此我们定义了一个长整型变量SplitStack来保存每次分叉状态所导致的分割平面,最低三个比特就是最近一次分割平面。这样当光线在KD树中遍历时,如光线横跨当前节点的分割面,就不再需要将“远”子节点和t_split,t_max压入堆栈,只需要将分割平面更新存入 SplitStack变量即可。将线索KD树算法与Foley和Horn等人提出的算法进行了比较,各算法的效率比较如表1所示。
权利要求
1.空间求交中的一种高效数据结构,其特征在于该数据结构用来保存与每个叶子节点六个面相邻的节点,所述叶子节点以及与叶子节点六个面相邻的节点位于一个KD树中。
2.根据权利要求1所述的空间求交中的一种高效数据结构,其特征在于所述与叶子节点六个面相邻的节点的类型为叶节点或中间节点。
3.根据权利要求1所述的空间求交中的一种高效数据结构的算法,其特征在于设每个叶子节点六个面相邻的节点即为该叶子节点的六个线索,将父亲节点的线索值继承给孩子节点,然后根据父亲节点的分割方式修正孩子节点的两个线索;进行光线遍历跟踪时,遍历时如果光线经过了叶子节点且和此叶子节点中的图元无交点,则根据光线的穿出平面及该穿出平面的线索值得到下一个需遍历的节点。
4.根据权利要求3所述的空间求交中的一种高效数据结构的算法,其特征在于用一个三比特的索引值来表示所述穿出平面。
全文摘要
本发明公开空间求交中的一种高效数据结构及其算法,其特征在于该数据结构用来保存与每个叶子节点六个面相邻的节点,即为每个叶节点保存了六个线索,这样根据光线在当前叶节点的穿出平面沿着线索直接得到后继节点,避免了从根节点或中间节点到叶节点过程中的“远”子节点压栈操作,从而可显著提高运算效率。
文档编号G06F17/30GK102184223SQ20111011677
公开日2011年9月14日 申请日期2011年5月6日 优先权日2011年5月6日
发明者张健, 沈卫康, 焦良葆, 王少东, 陈瑞 申请人:南京工程学院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1