一种基于GPU加速的维诺图三维网格重构方法与流程

文档序号:14475325阅读:622来源:国知局
一种基于GPU加速的维诺图三维网格重构方法与流程

本发明属于三维网格重构技术领域,具体涉及基于维诺图特性和gpu的通用计算加速的网格重构方法。



背景技术:

三维网格模型作为三维媒体的一个重要载体得到了越来越广泛的关注与应用,在工业制造、数字娱乐、数字文化遗产、智能城市等方面发挥了重要的作用。近年来,随着计算机处理能力的提高和三维扫描技术以及视觉重建技术的发展,三维网格模型的获取变得更加容易和快捷。但是,初始获得的粗糙模型通常存在各种缺陷,很难直接用于各种计算,通常需要进行去噪,修补,简化,以及重采样等处理以满足应用需求。

目前三维网格模型主要由如下几种方式获得:(1)通过激光扫描仪扫描得到粗糙点云数据并进行重建;(2)通过对连续曲面离散化;(3)通过对体数据或者隐函数的等值面提取;(4)通过计算机视觉方法获得(比如通过多角度图像重建,或者通过三维模型的轮廓线重建等),如图1所示。通常情况下,这些模型往往存在数据量大、网格质量差等缺点,不能直接用于比如有限元模拟、计算机动画、三维打印等对网格质量要求很高的应用中。重新网格化(remeshing),是在输入网格的基础上,在保持拓扑信息不变的前提下对网格进行重采样并且网格化,以满足不同应用的各种需求。

voronoicells方法是生成非结构网格的常用方法之一,通常的文献都称之为delaunaytriangulation方法,这是因为人们一般都采用与voronoicells等价的delaunaytriangles的数据结构和算法。基于voronoi本身结构的特性,将普通的三角网格结构转化为有delaunaytriangles,能大大的增强复杂模型在解决问题的时候的健壮性。同时维诺图生成网格时还使用了树状搜寻方法,本身就具有高效性,为之后实时重构铺下了基础。

此外,在巨大的游戏市场的驱动下,图形处理器gpu(graphicsprocessingunit)正在快速地发展。gpu的运算能力已经高于cpu。gpu与cpu相比,在浮点运算能力,内存带宽,价格上都体现了极大的优势。然而由于gpu的硬件构造是为图形显示而设计,并不适合完成cpu所进行的通用计算任务。随着今年来对于gpu通用计算的研究,以及gpu厂商的推动,现在出现了较为完善的通用计算编程语言和gpu的驱动。在支持通用计算的gpu中,顶点着色器,几何着色器,以及像素着色器都是高度可编程的。对于用户来说这些着色器统一成为流处理器。

当前主要的gpu通用计算语言包括cuda和opencl(opencomputinglanguage)。英伟达公司提出cuda并行计算架构。cuda利用gpu的浮点计算能力,可大幅度提升计算性能。cuda是针对nvidia显卡架构进行特别设计和优化的gpu通用计算语言。opencl则是由苹果公司提出的,多家公司共同联合开发的,跨平台异构系统的通用计算语言。opengl是可以运行在不同厂商gpu,cpu,dsp,等处理器上而不需要进行代码改写的异构平台的通用计算语言。

在看到gpu强大的运算能力和不断完善的通用计算能力与接口,越来越多的科学计算算法借助gpu平台实现,并获得了显著的加速比。另一方面,三维网格是计算机图形学中用来表示三维模型的一种重要方式。网格重建(remeshing)通过调整顶点的分布,顶点的连通度和三角形的大小等因素来改善模型质量,对网格的后续有效处理有着重要意义。其在几何建模和计算机视觉等很多领域都起着非常重要的作用,例如网格的生成和编辑,网格的变形和简化,去噪,压缩等。

每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(sharedmemory);最后,grid中所有的线程都可以访问同一块全局存储器(globalmemory)。除此之外,还有两种可以被所有线程访问的只读存储器:常数存储器(constantmemory)和纹理存储器(texturememory),它们分别为不同的应用进行了优化。全局存储器、常数存储器和纹理存储器中的值在一个内核函数执行完成后将被继续保持,可以被同一程序中其也内核函数调用。

模型重建对于一个给定的三维模型m,通过网格重建可以得到一个类似于原始模型的新模型m’,且新模型m’能满足给定的质量要求。对于不同的应用,网格重建的要求不同,质量的好坏衡量尺度涉及顶点分布,光滑度,规则性,规模,三角形的形状等方面。在计算机图形学的动画等领域,比较关注如何在网格的质量与运行速度之间取得一个比较好的平衡,以获得实时和真实的效果。这要求在网格重建的过程中,通过硬件手段和算法级别的优化,来在保证质量的同时,提升运行的速度。与此同时,以cuda(computeunifieddevicearchitecture)为代表的基于gpu的通用并行计算架构的出现与兴起,提供了一个更好的平台让人们对三角网格的重建进行更好的优化。

现在已有一些关于计算rvd的线性算法,但这些算法的速度有很多限制,并不足以支持很多三维重建的场景,也并不能支持实时模型重建。而我的发明利用当前gpu的并行架构,将rvd的计算速度提升了一个数量级。更快的计算rvd能够提高很多应用的效率。



技术实现要素:

本发明要解决的技术问题是:克服现有技术的不足,利用gpu硬件的计算能力,提供一种更为快速且高质量的基于gpu加速的维诺图三维网格重构方法,利用了维诺图的空间特性,增大网格的最小角,在保证网格的几何拓扑质量的同时,利用算法的并行特性,极大的增加了计算速度。

本发明解决上述技术问题的技术方案为:一种基于gpu加速的维诺图三维网格重构方法,包括如下步骤:

(1)输入任意一个三角面片模型并在该模型表面上均匀采样,根据组成模型的每个三角面片面积大小所占比例选择其面片上的点数,利用kd-tree(分割k维数据空间的搜索树,在本发明中一般选取三维)搜索点集中每个采样点附近的k个近邻点,将这些近邻点的索引线性储存起来,这种利用kd-tree实时来计算维诺图的方法大大增加了运算效率;

(2)将步骤(1)中的输入模型的位置和权重值,模型上的采样点集数据和由kd-tree搜索出的采样点集的邻近点索引信息传入gpu,根据点集和模型顶点的数量选择以点并行或者以面片并行的策略,在gpu的每个线程中,选择离输入该线程的每个模型三角面片的重心最近的点作为第一次与这一面片进行迭代的点,在每次迭代中,计算通过重心的近邻点和三角面片中心点计算的中垂面与此三角面片的交点对作切割,并在切割过程中记录下次迭代点的索引和记录切割后的多边形的顶点位置;

(3)将步骤(2)中的多边形polygon,(切割后的多顶点凸多边形,也是所需rvd数据的一种表现形式)作为rvd(restrictedvoronoidiagram,受限制的维诺图)数据记录,并通过利用共享存储器sharedmemory写速度快的策略进行优化,利用这种gpu算法,能较快的算出rvd,利用rvd可以优化模型的质量。

所述步骤(1)具体实现如下:对于输入的三维网格记录顶点,网格的三角面片和边索引关系,在该三角模型的表面上进行点集采样,然后构建一颗用于搜索的空间kd-tree树,通过空间kd-tree树查询两种近邻数据,对于点集中每个点查询邻近的k个点,对于每个面片的重心,查询最近的点,并将这两个数据线性表示,这个计算过程在gpu上实现,利用硬件设备架构cuda的硬件加速,大大提高查询速度。

所述步骤(2)包括:对于步骤(1)中的三维模型位置和权重值数据传入gpu后,进行多次迭代计算每个三角面片和点集所构成的维诺图的交集,在gpu的每个线程中,计算的是一个点和一个面片计算rvd的单位,集中点所在的维诺图是用步骤(1)中点的邻近点来表示的,在计算交集过程中,实时计算中心点和其近邻点的中垂面,用切割算法,如sutherland&hodgman’s算法来切割的polygon,在切割过程中判定记录计算中垂面的点索引来作为下次迭代的点,然后记录多边形的顶点位置。

所述步骤(2)中计算的polygon包含三种数据分别代表着点的位置,权重和邻居的索引,基于共享内存在数据传输速率上比全局内存要快,利用共享内存的使用来缓解原子操作的时间消耗,每次迭代后将点位置和权重移至rvd的中心,在新的位置上重新计算构建,查询kd-tree,来进行下一次迭代,当能量函数收敛是完成整个模型重建的过程。此过程中将设计更适应于gpu的数据结构,同时利用sharedmemory,在每个线程中单独分配一块内存进行临时储存,将数据暂存其中,sharedmemory本身的读取速度远高于全局内存,增加了rvd的计算效率。

本发明的原理:

1)利用k-dtree表示点集数据的voronoicell

voronoicells方法是生成非结构网格的常用方法之一,基于其本身的特性,将普通的三角网格结构转化为delaunaytriangles能大大的增强复杂模型在解决问题的健壮性。但对给定点集计算并记录其维诺图对时间和空间的耗费都相当大,于是提出了一种方法:利用k-dtree计算邻近点的索引,在需要用到voronoicells时再利用索引实时计算。

2)利用gpu并行计算每个点集的rvd

在已经记录了输入模型和输入点集数据以及近邻关系数据后,设计gpu数据结构来存储。基于每个三角面片计算的独立性,并行计算每一个三角面片和对应点集的交集。通过计算空间中点的相对关系,利用三角形求相似得到空间中的等比关系算出交点的位置和权重值,同时将相交的邻近信息记录到交点中来保证下一步正常的迭代遍历。

3)点集更新与三维网格重构

在2)中已经在gpu中获得了rvd的数据,利用这些数据所换算的权值和中心位置信息来更新点的位置。再利用新的位置再次计算k-dtree进行循环迭代直至能量函数收敛。最后利用这些点来生成新的三角网格,新的三角网格和愿三角网格的拓扑结构是保持一致的,但网格质量更好。

本发明与之前的方法相比的优点在于:本发明能够在保证质量的同时快速的迭代三角网格的重构。本发明主要有两点贡献:第一,利用k-dtree的近邻关系表示维诺图,减少了每次迭代过程中大量计算维诺图的时间和存储维诺图的空间。第二,利用该算法中点和三角面片计算的独立性进行并行计算,使得算法的速度和效率大大增加。

附图说明

图1为本发明方法整体流程图;

图2为本发明中3dkd-tree示意图;(a)近邻搜索问题;(b)kd-tree3d示意图;

图3为本发明中restrictedvoronoidiagram示意图;(a)restrictedvoronoi图,(b)1次迭代后效果图,(c)126次迭代后效果图;

图4为本发明中切割示意图;(a)k近邻点表示维诺图,(b)切割图;

图5为本发明中切割后cudapolygon表示图;

图6为本发明中gpu线程分配示意图;

图7为本发明中利用sharedmemory优化写冲突图;

图8为本发明中在不同特征模型上remeshing效果图;

图9为本发;明中在形变模型上cvt迭代效果图。

具体实施方式

下面结合附图以及本发明的具体实施方式进一步说明本发明。

对于该三维网格重构算法,本方法的输入是一个三维模型(包含顶点信息和面片索引信息)。而整个并行重构算法包括以下步骤如图1所示,

步骤(1)并行算法的输入是一个三维模型网格和其表面的点集。在读入模型的同时将会记录模型的顶点,面片索引信息以及三角面片的边信息(在以点集中每个点并行算法策略时会用到该信息),由于输入模型是由很多三角面片组成,而每个面片的大小不同,为使得能量函数收敛得更快,在表面取样点集时,采用均匀取样,即根据三角面片的面积大小的比例取点。

步骤(2)如图2所示,a是一个二维空间点击,搜索近邻点来建立kd-tree,图b是在三维空间中建立kd-tree,点集将空间划分为诺干区域,在每个区域中的搜索复杂度仅仅和树的高度成线性相关。利用输入点集构造k-dtree,这个过程采用cpu多核来提高构造和查找效率。采用轴垂直分割面(axis-alignedsplittingplanes)。方法如下:

(a)随着树的深度轮流选择轴当作分割面。(例如:在三维空间中根节点是x轴垂直分割面,其子节点皆为y轴垂直分割面,其孙节点皆为z轴垂直分割面,其曾孙节点则皆为x轴垂直分割面,依此类推。)

(b)点由垂直分割面之轴坐标的中位数区分并放入子树

这个方法产生一個平衡的k-d树。每个叶节点的高度都十分接近。然而,平衡的树不一定对每个应用都是最佳的。

其次是最近邻搜索,用来找到树中与输入点最接近的点。k-dtree最近邻搜索的过程如下:

从根节点开始,返回的往下移。往左右节点的方向取决于插入元素的方法(如果输入点在分区面的左边则进入左子节点,否则进入右子节点)。

一旦移动到叶子节点,那么将该节点设置为目前最佳节点。并求出目前最佳节点中的最近距离。

由最佳节点向根结点回溯,若搜索点到分界线的距离比当前最近距离小,则比较该父节点中点的距离和当前最小距离来判断是否更新。

当回溯到根节点后,完成最近邻搜索。

使用k-dtree充分利用了点集在空间中的相关性,这些k近邻搜索需要的运算时间仍然是以k近邻搜索为基础的高层算法的瓶颈。利用k近邻搜索,获取点集中每个点的k近邻,这些近邻点索引被线性储存起来,用于计算这个点的voronoicell壁。计算每个三角面片的中心坐标,并搜索每个点的最邻近点,基于维诺图的特性,最近点的voronoicell必然会和此面片有交集,故将这些点作为第一次迭代点。图3是在一个模型上计算每个采样点的voronoicell并在优化过程中更新维诺图,最终利用点集来构建一个新的模型。

图4所示为以三角面片为并行单位,在gpu中计算voronoicell的过程,并行用voronoicell和三角面片求交集。步骤(3)在获得了点集中每个点相对于其它点以及模型三角面片中点的邻接信息后,将这些数据传递进gpu中,单独设计了更适合进行gpu计算的数据结构:cudapolygon,cudavertex。由于cuda编程是不允许动态分配内存的,cudapolygon静态拥有15个cudavertex对象,而cudavertex有五个属性,x,y,z,w,s分别代表着点的位置,权重和邻居的索引。其中位置和权重用于更新点的位置,而邻居的索引值用于标识下一次迭代中计算的点。

步骤(4)将根据输入模型的顶点数和点集数比例数来选择并行策略。

有两种并行策略可供抉择:

a)以每个三角面片为单位起一个线程。在已知点的k近邻关系的情况下或者在已知该点周围维诺图的结构前提下,计算该面片与这些点依次计算rvd的结果,并将rvd结果从device拷贝至host。

b)以点集中的每个点起一个线程,同样对这个点所构成的voronoicell进行预处理,求得与其有交叉的三角面片的索引值,在gpu中依次裁剪,并将rvd结果计算出来。

这两种并行策略各有其优缺点,第一种并行策略,预处理阶段只需要算出点集中每个点的k近邻即可,相比于第二种仍然需要计算三角面片的位置进而通过比较算出面片附近的点大大地减少了计算时间。但第一种方法在存储rvd数据时,由于存在不同面片往同一位置添加信息的操作,需要额外的添加互斥锁,这一步又增加了耗时。固在模型点多的时候我们采用以三角面片的单位进行并行,增大并行力度,反之采用以点并行。

这两种并行策略中,由于gpu不能动态分配内存,静态地为每个线程分配栈大小来存储已经计算过的点索引。当点集的数量远超过模型面片数时,栈内存的静态特性将受限影响线程所分配的寄存器数。故此时应该使用点并行策略,在更多的情况下,由于点并行会有更多查询边操作的过程来进行迭代,这一步会增加读操作,而读操作正是此算法的瓶颈所在,故多数情况下将采用面片并行策略。

步骤(5)、在步骤(4)选择完并行策略后,将并行对每个面片和顶点对应的pair计算rvd。首先在每个线程中,将三角面片初始化为一个cudapolygon,然后找到离这个三角面片最近的点,用这个点和其邻近的点构成该点的voronoicell,然后利用切割算法对当前polygon切割。在切割的过程中,每当两个点所计算所得的中垂面和三角面片有交点时,用sutherland&hodgman’s算法来切割的polygon,图5为计算而得的polygon多边形,也就是所需的rvd数据,其每个顶点都储存了一些索引值用于下次迭代,本身的位置信息和权重信息也可以用于更新点集。由于有交点代表着两个点所在的vonoricell都和该三角面片必然有交集,在切割过程中判定记录计算中垂面的点索引来作为下次迭代的点。在整个过程中用两个stack来管理要和该面片做切割计算的点的索引。因为gpu中不允许动态的申请内存,故采用两个静态大小的栈分别是has_visited_stack和to_visited_stack来存储点索引。图6是在一次计算过程中得到的rvd,其记录了下一次迭代所需的索引信息,用这些信息来更新两个线程内栈,保证算法的正确性。

步骤(6),对于步骤(5)中的计算所得的polygon被称之为rvd(restrictedvoronoidigram)。其中对于构成点集中点的voronoicell定义为:

rk={x∈x|d(x,xk)≤d(x,xj)}

其中d(x,xi)代表点x和xi之间的欧拉距离。而rvd则是voronoicell和三角面片的交集。而每块rvd片段都会对应一个点集中的点,在记录rvd数据时,如图7所示为解决写冲突示意图,当不同线程内发生冲突时,利用一个共享内存来临时存储数据,从而减少发生冲突的可能性,这样做也能较好的增加gpu计算的效率,将往这个点所在的内存写数据。而当不同的线程计算同一个点所在的rvd时,将会存在多个线程往同一块内存里写数据的情况。故采用原子操作(atomicoperations)保证程序的正确性。而大量线程往同一块全局内存中写数据会使得这些操作线性化,大大增加算法耗时。如图7所示,而共享内存(sharedmemory)的写操作速度快,于是在每个block中设置一段共享内存来临时存储每个点对应的rvd数据,既保证了原子写(atomicadd)时间,却大大减少了冲突率,增加了效率。在写数据结束后,叠加每个点对应的rvd数据,根据能量函数收敛来更新点的位置,即将点设置为rvd的权重中心。每次更新后,将重新利用点建立kd-tree并搜寻k近邻点,进行下一次迭代。多次迭代将能量函数收敛后,利用deluanay三角化算法重建三角模型,完成算法。

本发明的实现使用的软件平台为microsoftvisualstudio2013与opengl,使用了cuda来加速并行算法的计算效率。硬件平台为4.0ghzinter(r)core(tm)i7-7700cpu、8gb内存以及nvidiageforcegtx1070gpu。方法效果图如图8,图9所示。图片针对两种不同特征的模型进行输出,图8上面的模型代表有尖锐三角面片特征的模型(gragoyle.obj,拥有60k面片,向下采样10k点集),左中右分表代表原始模型,cpu优化模型和gpu优化模型,进行100次迭代,其中cpu耗时12.14s而gpu耗时为1.62s;而下面的模型代表平滑特征模型(mask.obj,拥有3k三角面片,向上取样10k点集),进行100次迭代,cpu耗时3.91而gpu耗时0.71。可见在保证和cpu的模型重建质量相同的情况下,gpu大大加快了计算速度和效率。图9表示用gpu算法在形变模型上做模型优化,所用模型序列有55k三角面片,5k采样点,耗费094s进行80次迭代,利用gpu计算速度的优化,可以在形变模型上实时的进行优化。

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