基于GPU的构建BVH树并行光线追踪方法技术

技术编号:8533849 阅读:1528 留言:0更新日期:2013-04-04 17:38
本发明专利技术公开了一种GPU上的并行构建BVH树进行光线追踪方法,属于计算机图形学领域。图形学中有些在传统CPU上的串行计算方法已经逐渐转移到采用拥有强大并行计算能力的GPU来处理。本发明专利技术的方法为:应用GPU并行特性进行BVH空间划分的数据结构设计;采用SAH机制并行划分空间;利用GPU并行计算射线与图形元相交信息,从而提高光线追踪效率。本发明专利技术能够在GPU处理器架构上并行高效地构建输入3D模型的高质量BVH空间划分结构,其效率要比传统CPU串行优化指令SIMD高。特别是在动态光线追踪的情形下,其加速效率要远高于目前比较流行的KD-Tree空间划分方法。

【技术实现步骤摘要】

本专利技术属于计算机图形学领域,具体涉及一种利用GPU构建BVH树进行并行光线追踪方法的方法,该技术能够大大降低传统CPU光线追踪的计算时间。
技术介绍
光线追踪算法是真实感图形学领域中的重要算法,它通过模拟光线在传播过程中的反射、折射现象,将光线的颜色与物体的材质属性结合建模,能对复杂的三维物体做出较好的仿真,适合绘制表面光洁度高或具有透明表面和镜面的场景。在整个算法中,计算量最大的就是光线与场景图形元的求交过程。若考虑动态光线追踪,还需要加上整个场景空间结构的建立。随着GPU性能正以每年翻倍的速度发展,动态光线追踪生成动画越来越成为工业界的趋势。在对场景进行空间划分的方法中,最常用的就是KD-tree和BVH-tree。这两种方法都可以完成光线追踪,但是在动态场景当中,BVH-tree性能更加优于KD-tree。同时,实验研究已经表明表面积启发SAH方法可以生成高质量的生成树,但却需要极大的时间开销,这阻碍了 BVH-tree的快速构建,且即使通过优化SAH机制还是无法达到动态光线追踪的效果。但是如果利用GPU完成BVH-tree的建立,并用GPU计算SAH函数,就可以大大加快光线追踪前期准备速度,而且利用GPU并行处理求交还可以很好弥补CPU串行计算求交的低效性。
技术实现思路
本专利技术要克服先有光线跟踪方法效率较低的缺点,提出一种在GPU上快速高效建立BVH-tree进行并行光线追踪的方法。该方法通过在GPU上高效地建立BVH-tree来加快光线追踪速度,并利用GPU并行计算光射线与图形元相交处的信息,从而提高光线追踪效率。本专利技术的技术方案为基于GPU的构建BVH树并行光线追踪方法,其步骤为I)读取3D场景模型,设置三角形的模型图形元,将这些数据存储在GPU显存中。2)创建一个动态增长存储BVH节点的空间。3)根据模型图形元,分别求X轴、Y轴和Z轴的跨度,并计算出最大值,以这个最大值的坐标轴使用SAH机制划分空间。4)判断由步骤3)分割的子节点当中的三角形数目是否大于1,若大于I则返回到3)。5) BVH-tree构造完毕,输出线性结构BVHlist数组。6)根据视点和投影面构造射线。7)构造一个BVH元素的堆栈,声明变量stackoffset=0。8)取当前射线与当前所指BVHlist节点做相交测试。9)如果当前射线与这个BVH节点不相交,而且如果stackoffset为0,表明当前光线与场景无相交,则结束当前射线的光线追踪;反之stackoffset大于0,那么stackoffset减1,并且把当前节点设置为堆栈中偏移量为stackoffset的节点,返回步骤8);如果当前射线与这个BVH节点相交转移到步骤10)。10)判断该BVH节点中是否有图形元三角形,如果有,说明当前射线与一个BVH树的叶子节点正方体有相交,并继续测试该射线与节点内的三角形是否相交,如果相交就把当前的节点和三角形序号交给该射线。若stackoffset大于0就减1,并且把当前节点设置为堆栈中偏移量为stackoffset的节点,返回步骤8)。如果BVH节点没有图形元三角形就转移到步骤11)。11)根据当前节点的右节点标记变量,把右节点序号放入堆栈中,然后stackoffset加I,把当前节点设置为之前节点的左节点,返回步骤8)。本专利技术的效果如下首次在GPU上对3D模型实现了高质量的BVH-Tree的并行构建方法,每次划分空间采用SAH划分机制,这极大提高了 BVH-Tree的平衡性。并且通过对光线与模型做并行相交运算,大大减少了原先串行计算的复杂度。附图说明图1为本专利技术的算法流程2为本专利技术的BVH空间划分3为本专利技术的射线与正方体求交方法4为本专利技术的BHV-tree保存结构图具体实施例方式以下实施方式结合附图对本专利技术进行详细的描述,参照附图,本专利技术包括以下步骤I)读取3D场景模型,并设置三角形的模型图形元,这些数据存储在GPU显存中。这些数据是以DirectX规定的SRV格式保存的,一共有两个SRV。第一个SRV中保存用于遍历的图形元三角形序号数组。第二个SRV中保存图形元三角形的顶点数组。2)创建一个动态增长存储BVH节点的空间。若在未来添加节点的时候,发现空间不够,可以把原来创建的BVH空间扩大一定数量,视需求而定。3)根据模型图形元,分别求X轴、Y轴Z轴的跨度。这里用2D的情况解释一下具体方法,如图2所示最大的长方形内部的三角形,显然横向跨度为(V2max-Vlmin )的x值,纵向跨度为(V2max-Vlmin )的y值,显然这里x比y大,我们以x坐标轴使用SAH机制划分空间。SAH假设光线是随机发射的,因此碰到长方体的几率也是一样的,它保证空间划分的时候尽量保证两个子空间内部的长方体面积相等。这样得到的BVH-tree平衡性较高。4)为了发挥BVH的最大效率,我们选择每个叶子节点能够容纳的最大一个三角形,以此判断由3)分割的子节点当中的三角形数是否大于1,若大于I返回到步骤3),反之转到步骤5)。5) BVH-tree构造完毕,输出线性结构BVHlist数组,该数组结构如图3所示。一个BVH节点保存着一个长方体坐标最小点Vmin和一个坐标大点Vmax,这两个点就可以确定一个长方体。我们默认该数组中节点的下一个元素即为节点的左节点,因此必须保存一个该节点的右节点和内部三角形图形元个数。若该节点是叶子节点,那么三角形图形元个数就为O。6)设定视点和投影面,为了方便可以设置视点为(0,0,0),投影面的左下角为(-1,-1, 2)和右上角为(I, I, 2)。7)构造一个节点元素堆栈,这个栈的大小也可以默认设定一个值,我们设定初始值为34,当栈溢出的时候可以动态增加一定的值,并且申明变量当前栈标记stackoffset=0o8)把当前射线与当前的节点长方体做相交测试。如图4所示,每条射线表示为r=e+t*d,其中e为视点(0,0, 0),d为射线的方向,t为射线与某个空间结构相交时的参数。根据图2,首先我们计算射线与直线X=Xmin相交的参数txmin= (Xmin -Xe)/Xd。用相同的方法可以求得txmax, tymin, tymax。这条射线若与这个长方体相交,那么[txmin , txmax]和[tymin , tymax]应该相交。9)如果当前射线与这个BVH节点不相交,而且如果stackoffset为0,则表明当前光线没有与场景相交,则结束当前射线光线追踪;反之stackoffset大于0,那么stackoffset减I,并且把当前节点设置为栈中偏移量为stackoffset的节点,转移到步骤8)。如果当前射线与这个BVH节点相交则转移到步骤10)。10)判断该BVH节点中是否有图形元三角形,如果有,说明当前射线与一个BVH树的叶子节点正方体有相交,并继续用经典的重心交点测试法测试该射线与节点内的三角形是否相交,如果相交就把当前的节点和三角形序号交给该射线。若stackoffset等于0,则结束当前射线的光线追踪;若stackoffset大于0就减1,并且把当前节点设置为堆栈中偏移量为stackoffset的节点,转移到步骤8)。如果BVH节点没有图形元三角形就转移到步骤11)。11)根据当前节本文档来自技高网...

【技术保护点】
GPU上构建BVH树并行光线追踪方法,其步骤为:1)读取3D场景模型,设置三角形的模型图形元,这些数据存储在GPU显存中;2)?创建一个动态增长存储BVH节点的空间;3)?根据模型图形元,分别求X轴、Y轴和Z轴的跨度,并且求出最大值,以这个最大值的坐标轴使用SAH机制划分空间;4)?判断由步骤3)分割的子节点当中的三角形数目是否大于1,若大于1返回到步骤3),反之下一步;5)?BVH?tree构造完毕,输出线性结构BVHlist数组;6)根据视点和投影面构造射线;7)构造一个BVH元素的堆栈,声明变量stackoffset=0;8)取当前射线与当前所指BVHlist节点做相交测试;9)如果当前射线与这个BVH节点不相交,而且如果stackoffset为0,表明当前光线没有与场景相交,结束当前射线的光线追踪;反之stackoffset大于0,那么stackoffset减1,并且把当前节点设置为栈中偏移量为stackoffset的节点,转移到步骤8);如果当前射线与这个BVH节点相交转移到步骤10);10)判断该BVH节点中是否有图形元三角形,如果有,说明当前射线与一个BVH树的叶子节点正方体有相交,并继续测试该射线与节点内的三角形是否相交,如果相交就把当前的节点和三角形序号交给该射线。同时若stackoffset等于0,则结束当前射线的光线追踪;若stackoffset大于0就减1,?并且把当前节点设置为栈中偏移量为stackoffset的节点,转移到步骤8)。如果BVH节点没有图形元三角形就转移到步骤11);11)根据当前节点的右节点标记变量,把右节点序号放入栈中,然后stackoffset 加1,把当前节点设置为之前节点的左节点,转移到步骤8)。...

【技术特征摘要】
1.GPU上构建BVH树并行光线追踪方法,其步骤为 O读取3D场景模型,设置三角形的模型图形元,这些数据存储在GPU显存中; 2)创建一个动态增长存储BVH节点的空间; 3)根据模型图形元,分别求X轴、Y轴和Z轴的跨度,并且求出最大值,以这个最大值的坐标轴使用SAH机制划分空间; 4)判断由步骤3)分割的子节点当中的三角形数目是否大于1,若大于I返回到步骤3),反之下一步; 5)BVH-tree构造完毕,输出线性结构BVHlist数组; 6)根据视点和投影面构造射线; 7)构造一个BVH元素的堆栈,声明变量stackoffset=0; 8)取当前射线与当前所指BVHlist节点做相交测试; 9)如果当前射线与这个BVH节点不相交,而且如果stackoffset为O,表明当前光线没有与场景相交,结束当前射线的光线追踪;反之st...

【专利技术属性】
技术研发人员:吴哲夫虞鸿何熊熊陈滨
申请(专利权)人:浙江工业大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1