一种海量任意形状多边形的快速可视化方法

文档序号:6526143阅读:639来源:国知局
一种海量任意形状多边形的快速可视化方法
【专利摘要】本发明涉及一种海量任意形状多边形的快速可视化方法,其步骤包括:根据多边形的可视化先后顺序和遮挡关系将多边形输入序列进行局部分层,每层作为一组,根据从底层到高层的顺序安排各组的绘制顺序,使得分组后的绘制顺序不存在冲突关系,得到无冲突分组槽;从无冲突分组槽中取出一组任意形状的且无冲突关系的多边形,在三角扇化之后执行两遍分别具有计数和填充含义的绘制,多次重复以上过程后得到最终可视化结果。本发明能够提高海量任意形状多边形的可视化并行度,对比现有的ArcGIS以及Mapnik地理信息可视化引擎,速度可以达到2倍以上的提升。
【专利说明】一种海量任意形状多边形的快速可视化方法
【技术领域】
[0001]本发明属于计算机图形学、地理信息技术、可视化等【技术领域】,涉及一种GPU上针对海量任意形状多边形的快速可视化方法。
【背景技术】
[0002]在图形和GIS应用中,通常要处理和可视化大量的曲边、带多个洞、复杂的多边形。对于最简单的凸多边形且无空洞的多边形形式,现有的图形标准API (如OpenGL或者DirectX),都提供了直接绘制/可视化的方法。但是对于其它复杂的形式,尤其是凹多边形的形式以及带有孔洞的多边形,现有的标准图形API都不提供直接的支持,往往都需要大量的额外计算和处理工作。常用的策略有从计算几何角度对凹多边形进行Delaunay (德劳内)剖分处理(宋晓眉;张晓东;李建林,一种高准确度的约束Delaunay三角网生成算法研究,地理与地理信息科学,2009,25 (I),周培德计算几何一算法分析与设计2011 ),或者采用扫描线区域剖分方法(崔璨;王结臣.一种基于梯形剖分的多边形布尔运算方法.测绘学报2011(01)),或者研究采用其他全局或者局部的剖分方法(贺怀清,杨鹏.一种凹多边形凸分解的全局剖分算法[J].中国民航大学学报ISTIC,2011,29(3).)。作为图形标准的API, OpenGL也提供了一个网格化(tessellation)的回调程序框架,支持程序员自定义的网格化方法(即上述各种剖分方法),在转化成凸多边形之后再进行绘制和可视化。
[0003]无论上述各种对凹多边形进行额外处理的剖分算法,还是OpenGL提供的网格化框架,当面对大规模的甚至是海量的任意多边形时,都面临算法效率低下、处理和可视化速度缓慢的严重问题。尤其是在地理信息系统中(GIS),往往存在大量的凹多边形作为地理信息的要素数据。这些要素代表不同的地理信息含义,每个要素可能由数量庞大的边构成一个凹多边形,如省、市等行政区划以及湖泊、森林的边界等,有些多边形还可能由一个外边界和多个内边界构成(如环形的河流/湖泊)。要素的数目也非常庞大,要素彼此之间还存在复杂的图层先后关系。因此,海量的任意形状多边形(要素)的处理和可视化已经成为近年来地理信息系统的瓶颈之一。

【发明内容】

[0004]针对上述地理信息可视化中存在的严重问题,本发明提出一种基于GPU的任意多边形的快速并行可视化方法,能够对海量的具有任意形状的多边形(尤其是凹多边形)进行快速可视化。
[0005]本发明采用的技术方案如下:
[0006]一种GPU上针对海量且任意形状多边形的快速可视化方法,其步骤包括:
[0007]I)根据多边形可视化先后顺序和相互遮挡关系将多边形输入序列进行局部分层,每层作为一组,根据从底层到高层的次序安排各组的绘制顺序,使得分组后的同组内多边形的并行绘制顺序不存在冲突关系,并将分组数据存储在无冲突分组槽中,当满足一定条件时一层或者多层无冲突分组槽中的多边形数据被调度发送至绘制管线;[0008]2)绘制管线端接收到一组任意形状的且无冲突关系的多边形,对每一个多边形进行三角扇化,利用GPU对该组三角扇化之后的多边形并行执行两遍分别具有计数和填充含义的绘制操作以实现可视化;
[0009]3)重复步骤2)直到所有无冲突分组槽中为空,且不再有新的多边形放置入槽中,得到最终可视化结果。
[0010]进一步地,步骤I)中如果多边形B在输入图元序列中出现的顺序在A之后,而且B与A的包围盒存在重叠,则B与A存在潜在冲突关系,B不能与A进行并行绘制,B的绘制次序必须在A之后。
[0011]进一步地,步骤I)采用下列步骤进行分层并建立无冲突分组槽:
[0012]1.1)新建一个层,每一层对应一个槽结构,将输入多边形序列中的第一个多边形放入该层的空槽位置中;
[0013]1.2)对于输入多边形序列中剩余的每个多边形,执行如下操作:
[0014]1.2a)按照从底层向顶层的顺序进行搜索,找到所有与当前多边形存在包围盒重叠关系的多边形所在的层次,将其中的最高层记为第i层;
[0015]1.2b)如果第i层就是顶层,那么在其上新增加一层,即第i+Ι层,然后将该多边形放入新加的第i+Ι层的空槽位置中;
[0016]1.2c)如果第i层不是顶层,那么将该多边形按顺序放入第i+Ι层的空槽位置中。
[0017]进一步地,通过设定限制达到实时运行的要求:层次的数目不能超过N层,并且每一层中的多边形数量不能超过M个。
[0018]进一步地,采用以下无冲突分组槽调度策略保证槽中数据被合理发送至绘制端并满足上述层次数目和每一层多边形数目的限制:
[0019]A)如果在添加新层时层次的数量已经达到N层,那么首先将最底层槽中的所有多边形作为一个基本单元,发送到绘制管线中,然后将次底层作为新的最底层,各层顺次下移,最后在顶层再添加最新层;
[0020]B)设置每一层所对应的无冲突分组槽中的空槽位置的个数为M,如果在向某一个第i层次添加了一个多边形之后该层次中包含的多边形达到了 M个,此时该层分组槽中的空槽数目为0,则从最底层到当前第i层的所有槽以及槽中所包含的所有多边形全部发送到绘制管线中,每一层中的所有多边形作为一基本单元将执行后续的计数和填充操作(即步骤2))中的GPU两遍绘制),然后将该层的下一层(即第i+Ι层)作为新的最底层,第i+1层之上的所有层顺次下移;
[0021]C)输入流中如果出现非多边形图元,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作(即步骤2)中的GPU两遍绘制),将所有非多边形图元从输入中取出,一起送至绘制管线,然后清空无冲突分组槽,继续处理剩余多边形;
[0022]D)如果A),B),C)中的条件均不满足,但是输入流中的所有多边形均已被处理进入分组槽中,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作(即步骤2)中的GPU两遍绘制),然后调度算法结束。
[0023]进一步地,步骤2)所述执行三角扇化和两遍分别具有计数和填充含义的GPU绘制的步骤包括:
[0024]2.1)接收到从无冲突分组槽发送过来的作为一个单元的无冲突关系的多边形集合,为该多边形集合关联一个模板缓冲区(或者累积缓冲区),以此缓冲区作为为第一步计数绘制的目标和第二步填充绘制的测试依据;;
[0025]2.2)对每个任意形状的多边形进行如下处理:对多边形中的每个闭环,以环中的任意一个顶点为轴,按照顶点的排列顺序依次向其他顶点连线,构成一个辐射状的三角形扇网格,如果多边形中含有多个闭环则形成了多个独立无关的三角形扇网格;
[0026]2.3)进行第一遍具有计数含义的绘制:进行第一遍具有计数含义的绘制:对一个单元中的每个多边形闭环构造出的三角形扇网格并行地进行纯几何的绘制。绘制采用填充模式,此时色彩缓冲关闭,绘制结果写入并保存到2.1)关联的缓冲区中,在该缓冲区中被三角形覆盖到奇数次的点是位于多边形内部的点,覆盖到偶数次的点是多边形外部,或者是多边形内部的空洞区域;
[0027]2.4)进行第二遍具有填充含义的绘制:同时对一个单元中的每个多边形闭环构造出的三角形扇网格并行地进行正常的可视化绘制,或者以多边形的包围盒替代三角扇网格进行绘制。绘制采用填充模式,此时色彩缓冲开启并打开模板缓冲或者累积缓冲测试,只有落入到缓冲区中并且计数为奇数次的像素才能通过测试。如果所需要绘制的多边形图元为纹理填充模式,则需要计算纹理坐标并进行相应纹理映射,最终得到该组图元的可视化结果;
[0028]2.5)清空模板缓冲(或者累积缓冲);
[0029]2.6)如果还有尚未处理的无冲突分组槽及其多边形集合,则转入步骤2.1)继续处理,否则可视化算法结束。
[0030]进一步地,进行第二遍具有填充含义的绘制时,生成的纹理坐标符合以下条件:
[0031]a)纹理坐标在相邻的瓦片之间不能出现跳变,以实现相邻瓦片的无缝拼接;
[0032]b)任何一个点在屏幕空间上的坐标和它的纹理坐标在小数部分应当相同,使得纹理图像的每个像素刚好覆盖屏幕空间的一个像素;
[0033]c)两个点如果屏幕空间坐标的X分量相同,那么他们的纹理坐标的X分量也相同;y分量同理;
[0034]d)任何两个点在屏幕空间中的距离和它们在纹理空间中的距离相等。
[0035]本发明的可视化方法不采用传统的凹多边形剖分策略进行处理和可视化,针对单个任意多边形采用两遍GPU绘制的方法来首先计算出像素级精度的填充区域并随后进行填充和可视化;针对海量多边形,为了避免两遍绘制过程中所形成的GPU绘制流水线频繁阻塞并导致延迟,采用无冲突分组槽及调度机制来降低两遍绘制的数据依赖性(包含步骤依赖和模板重叠依赖),从而提高海量任意形状多边形的可视化并行度。本发明所提出的可视化方法对海量GIS多边形进行可视化,对比现有的ArcGIS以及Mapnik地理信息可视化引擎,可以达到2倍以上的速度的提升。
【专利附图】

【附图说明】
[0036]图1为采用两遍绘制策略进行多边形数据集可视化导致的数据依赖关系图
[0037]图2为实施例中分组不当导致的多边形遮挡关系错误示意图,其中(a)为正确的多边形绘制结果,(b)为错误的多边形绘制结果。
[0038]图3为实施例中无冲突分组槽的结构和可视化流程示意图。
[0039]图4为复杂多边形组的第一遍GPU绘制计数结果的示意图。
【具体实施方式】
[0040]下面通过具体实施例和附图,对本发明做详细的说明。
[0041]基本定义:
[0042]多边形(Polygon),其几何模型表达为:
[0043]I) 一个循环链表代表一个多边形的外边界,是由多边形的边按一定的方向组成的封闭序列,一个多边形只能有一个环链;
[0044]2) 一个环代表多边形中的一个洞,一个严格定义的多边形包含O个或有限个环,环中可以再包含环;
[0045]3)相邻线段对的交是其间共有的单个点(顶点),不相邻的线段对不相交(即不能自相交)。
[0046]凹多边形(Concave Polygon):至少有一个优角(Reflexive Angle)的多边形。把一个各边不自交的多边形任意一边向两方无限延长成为一直线,如果多边形的所有边中只要有一条边向两方无限延长成为一直线时,其他各边不在此直线的同旁,那么这个多边形就叫做凹多边形。凹多边形有一个或多个内角大于180度。
[0047]槽:特定的占用一定空间并具有资源存储和管理功能的容器结构,并且对外部提供了可供灵活使用该结构的接口和方法。槽中可以分出多个槽位,每个槽位代表一个空间资源的使用情况,并有相应的标记表示当前槽位所具有的状态,每个槽位可以容纳不同类型的资源。当一个资源或者数据流入槽中时,槽结构会找到空闲的槽位容纳该资源并标记当前槽位已经被占用。槽结构提供了数据输入的接口以及数据流出并清空槽的接口和方法。
[0048]步骤1:无冲突分组槽及调度
[0049]由于多边形填充可视化算法分为两遍绘制步骤,其中第一步向GPU的模板缓冲区(或者累积缓冲区)中写数据(进行计数),第二步根据第一步写入的结果决定是否向色彩缓冲填充多边形所覆盖的每个像素,这就在两个步骤之间引入了数据依赖(称为步骤依赖),导致第一步(计数操作)结束前第二步(填充操作)不能开始。又因为第二步在填充每个像素完成之后需要将该像素对应的模板缓冲区(或者累积缓冲区)清零,以便下一个多边形绘制时模板缓冲区(或者累积缓冲区)处于全零的状态,所以前后两个多边形的绘制操作之间也存在数据依赖(称为模板重叠依赖),即上一个多边形的填充(并清零)操作结束前下一个多边形的计数也不能开始。这样,每绘制一个多边形都要产生两次缓冲区的数据依赖,如图1所示。如果多边形的数量很多,但每个多边形的顶点数和覆盖的像素数量很少,那么GPU的绘制流水线将频繁阻塞,GPU的并行特征得不到充分的利用。
[0050]在GPU shader中使用模板缓冲区(或者累积缓冲区)操作进行测试,得到如下结论:如果在两次绘制步骤之间不使用GPU的纹理内存屏障进行同步,那么在绘制多边形数量较多,但每个多边形都较小的数据时,绘制速度很快,但是会导致绘制结果出错;如果使用纹理内存屏障进行同步,那么绘制结果不会有错,但是绘制速度缓慢。[0051]要提高多边形绘制的性能,最关键的是要减少缓冲区数据依赖的数量。注意到一个简单的事实:如果多个多边形的矩形包围盒互相都不重叠,那么它们在绘制时对缓冲区的操作也是互不干扰的。对于这样的一组无冲突的多边形,可以先全部执行一遍计数操作(第一遍绘制),然后再全部执行一遍填充绘制操作,所得到的结果和逐个进行计数和填充是完全一样的。将需要绘制的多边形分为若干个这样的组,就能将数据依赖的次数从每个多边形两次减少为每组两次,如果每组中的多边形的平均数量足够大,就能大大减少海量多边形可视化时数据依赖的次数。
[0052]下面具体说明本发明的多边形分组策略。
[0053]由于输入的多边形图元是有序的,并且图元之间可能存在遮挡关系,如果分组不恰当,可能会产生错误的可视化结果。如图2所示,图中三个多边形原本的绘制顺序为红、绿、蓝,分别用图2中的1、2、3来表示。由于红色I多边形和蓝色3多边形的包围盒不相交,所以他们有可能被分到一组。然而这样分组的绘制效果是和原来的绘制效果不一致的,如果先绘制红蓝多边形再绘制绿色多边形,就会产生图2b中的结果,绿色多边形2错误地覆盖了蓝色的多边形3 ;如果先绘制绿色多边形2再绘制红蓝多边形,就会导致红色多边形I错误地覆盖绿色的多边形2。事实上,在图2的情况下,任何非平凡的分组(平凡分组即每个多边形一个组)方法都不能产生正确的绘制结果,三个多边形的唯一正确的绘制顺序就是红、绿、蓝。
[0054]对多边形进行分组时,需要考虑到多边形的遮挡关系。具体的要求是:如果多边形B在输入图元序列中出现的顺序在A之后,而且B与A的包围盒存在重叠,则B与A存在潜在冲突关系,那么B的绘制顺序必须在A之后。将这一关系记作R(A;B),这一关系的传递闭包记为S(A;B)。
[0055]下面给出一个在线算法,该算法将多边形输入序列进行局部分层,每层作为一组,并使得分组后的绘制顺序满足无冲突关系的要求:
[0056]I)新建一个层,每一层对应一个槽结构,将输入多边形序列中的第一个多边形放入该层的空槽位置中。
[0057]2)对于输入多边形序列中剩余的每个多边形,执行如下操作:
[0058](a)按照从底层向顶层的顺序进行搜索,找到所有与当前多边形存在包围盒重叠关系的多边形所在的层次,将其中的最高层记为第i层;
[0059](b)如果第i层就是顶层,那么在其上新增加一层(第i+Ι层),然后将该多边形放入新加的第i+Ι层的空槽位置中;
[0060](c)如果第i层不是顶层,那么将该多边形按顺序放入第i+Ι层的空槽位置中。
[0061]可以证明根据上面的算法得到的多边形分层符合以下特性:如果多边形A所处的层次比B的层次低,那么S(B;A) —定不存在,也就是说A与B—定不存在冲突关系。因此,将每一层分为一组,该组中所存储在槽中的所有多边形之间也不存在重叠冲突关系。根据从底层到高层的顺序安排各组的绘制顺序,就可以保证得到的结果不违反多边形的遮挡关系要求。
[0062]因为该算法每添加一个多边形都要执行一次线性搜索,如果多边形的数量太多,那么该算法的执行效率会很低。为了达到实时运行的要求,需要加上两个限制:层次数目不能超过N层,并且每一层中的多边形数量不能超过M个。采用下面的无冲突分组槽调度策略保证槽中数据被合理发送至绘制端并满足上述层次数目和每一层多边形数目的限制:
[0063]I)如果在添加新层时层次的数量已经达到N层,那么首先将最底层槽中的所有多边形作为一个基本单元,发送到绘制管线中,然后将次底层作为新的最底层,各层顺次下移,最后在顶层再添加最新层;
[0064]2)设置每一层所对应的无冲突分组槽中的空槽位置的个数为M,如果在向某一个第i层次添加了一个多边形之后该层次中包含的多边形达到了 M个,此时该层分组槽中的空槽数目为0,则从最底层到当前第i层的所有槽以及槽中所包含的所有多边形全部发送到绘制管线中,每一层中的所有多边形作为一基本单元将执行后续的计数和填充操作,然后将该层的下一层(即第i+Ι层)作为新的最底层,第i+Ι层之上的所有层顺次下移;
[0065]3)输入流中如果出现非多边形图元,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作,将所有非多边形图元从输入中取出,一起送至绘制管线,然后清空无冲突分组槽,继续处理剩余多边形;
[0066]4)如果I),2),3)中的条件均不满足,但是输入流中的所有多边形均已被处理进入分组槽中,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作,然后调度算法结束。
[0067]在地理信息可视化的绘制模块中,面向百万级别的多边形我们通常设置N和M的值分别为8和24。
[0068]图3为无冲突分组槽的示意图(虚线框所包围部分),其中N=4,M=8,分组槽中的白色部分表示已经加入的多边形占据了槽中的位置,而灰色部分表示空槽位置。
[0069]步骤2:任意形状多边形两遍绘制
[0070]该步骤对应的就是图3中的绘制管线部分。本发明针对从无冲突分组槽中取出的一组任意形状的且无冲突关系的多边形,先进行三角扇化,然后执行GPU两遍绘制算法,流程如下:说明:由于第一遍计数绘制时采用模板缓冲或者累积缓冲都可以实现奇偶计数的功能,本方法的实现时采用了相对更加简洁的模板缓冲进行奇偶计数,因此后续的实现皆以模板缓冲为例。
[0071]I)接收到从无冲突分组槽发送过来的作为一个单元的无冲突关系的多边形集合,为该多边形集合关联一个模板缓冲区;
[0072]2)对每个任意形状的多边形进行如下处理:对多边形中的每个闭环,以环中的任意一个顶点为轴,按照顶点的排列顺序依次向其他顶点连线,构成一个辐射状的三角形扇网格,如果多边形中含有多个闭环则形成了多个独立无关的三角形扇网格;
[0073]3)进行第一遍具有计数含义的绘制:对一个单元中的每个多边形闭环构造出的三角形扇网格并行地进行纯几何的绘制。绘制采用填充模式,此时色彩缓冲关闭,绘制结果写入并保存到步骤I)关联的缓冲区中,在该缓冲区中被三角形覆盖到奇数次的点是位于多边形内部的点,覆盖到偶数次的点是多边形外部,或者是多边形内部的空洞区域;
[0074]4)进行第二遍具有填充含义的绘制:同时对一个单元中多边形的包围盒并行地进行正常的可视化绘制。绘制采用填充模式,此时色彩缓冲开启并打开模板缓冲测试,只有落入到缓冲区中并且计数为奇数次的像素才能通过测试。如果所需要绘制的多边形图元为纹理填充模式,则需要计算纹理坐标并进行相应纹理映射,最终得到该组图元的可视化结果;
[0075]5)清空模板缓冲;
[0076]6)如果还有尚未处理的无冲突分组槽及其多边形集合,则转入步骤I)继续处理,否则可视化算法结束。
[0077]图4所示为为复杂多边形组的第一遍GPU绘制计数结果的示意图。图4上部为要可视化的两个复杂多边形,左边的多边形包含一个外环和一个内环,右边的多边形为一个凹多边形;图4下部图为三角形网格的覆盖的计数结果,深灰色为偶数次覆盖,浅灰色为奇数次覆盖;区域内的数字表示该区域被三角形覆盖的次数。
[0078]在第一遍绘制时,在OpenGL下的实现方式为:
[0079]设置glStenciIFunc 为 GL_NEVER, glStencilOp (sfail, dpfail, dppass)为(GL_INVERT, GL_KEEP, GL_KEEP)。然后用GL_TRIANGLE_FAN模式绘制组内所有多边形的三角形网格,每个多边形对应一个三角形扇(triangle fan),由于只需要判断奇偶,所以计数操作可以简化为翻转操作。
[0080]在第二遍绘制时,在OpenGL下的实现方式为:
[0081]设置glStenciIFunc 为(GL_N0TEQUAL, O),glStencilOp (sfail, dpfail, dppass)为(GL_KEEP,GL_ZER0, GL_ZER0),然后绘制组内所有多边形的矩形包围盒,每个多边形对应
一个矩形包围盒。
[0082]下面说明第二遍绘制时填充像素的纹理坐标的生成。
[0083]多边形也有色彩填充和纹理填充两种填充方式。在使用纹理填充模式时,纹理在多边形的覆盖区域内平铺填充。要实现正确的纹理填充效果,生成的纹理坐标需要符合以下条件:
[0084]1.纹理坐标在相邻的瓦片之间不能出现跳变,以实现相邻瓦片的无缝拼接。
[0085]2.任何一个点在屏幕空间上的坐标和它的纹理坐标在小数部分应当相同,使得纹理图像的每个像素刚好覆盖屏幕空间的一个像素。这一特性称作纹理坐标和屏幕坐标“对齐”。
[0086]3.两个点如果屏幕空间坐标的X分量相同,那么他们的纹理坐标的X分量也相同;y分量同理。
[0087]4.任何两个点在屏幕空间中的距离和它们在纹理空间中的距离相等。这个条件其实可以由上面的2、3两条推出。
[0088]设sx和sy为屏幕坐标与世界坐标的尺度比。不同的瓦片对应的xmin和ymax值均不相同。但是sx和sy的值在同一层的所有瓦片上都是相同的。则纹理坐标的计算方法:
[0089]texCoordx=sx.x
[0090]texCoordy=-sy.y
[0091]可以证明这样得到的纹理坐标符合上面四个条件中的1、3、4条,但不符合第2条。为了使之也符合第2条,可以提取-sx.xmin和sy.ymax的小数部分,然后将纹理坐标的计算公式修改为如下形式:
[0092]texCoordx=sx.x+frac (-sx.xmin)
[0093]texCoordy=-sy.y+frac (sy.ymax)[0094]这样得到的纹理坐标的小数部分就与屏幕坐标的小数部分完全相同了。
[0095]以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
【权利要求】
1.一种GPU上针对海量且任意形状多边形的快速可视化方法,其步骤包括: 1)根据多边形可视化先后顺序和相互遮挡关系将多边形输入序列进行局部分层,每层作为一组,根据从底层到高层的次序安排各组的绘制顺序,使得分组后的同组内多边形的并行绘制顺序不存在冲突关系,并将分组数据存储在无冲突分组槽中,当满足一定条件时一层或者多层无冲突分组槽中的多边形数据被调度发送至绘制管线; 2)绘制管线端接收到一组任意形状的且无冲突关系的多边形,对每一个多边形进行三角扇化,利用GPU对该组三角 扇化之后的多边形并行执行两遍分别具有计数和填充含义的绘制操作以实现可视化; 3)重复执行步骤2)直到所有无冲突分组槽中为空,且不再有新的多边形放置入槽中,得到最终可视化结果。
2.如权利要求1所述的方法,其特征在于:步骤I)中如果多边形B在输入图元序列中出现的顺序在A之后,而且B与A的包围盒存在重叠,则B与A存在潜在冲突关系,B不能与A进行并行绘制,B的绘制次序必须在A之后。
3.如权利要求1所述的方法,其特征在于,步骤I)采用下列步骤进行分层并建立无冲突分组槽: 1.0新建一个层,每一层对应一个槽结构,将输入多边形序列中的第一个多边形放入该层的空槽位置中; 1.2)对于输入多边形序列中剩余的每个多边形,执行如下操作: 1.2a)按照从底层向顶层的顺序进行搜索,找到所有与当前多边形存在包围盒重叠关系的多边形所在的层次,将其中的最高层记为第i层; 1.2b)如果第i层就是顶层,那么在其上新增加一层,即第i+Ι层,然后将该多边形放入新加的第i+Ι层的空槽位置中; 1.2c)如果第i层不是顶层,那么将该多边形按顺序放入第i+Ι层的空槽位置中。
4.如权利要求3所述的方法,其特征在于,通过设定限制达到实时运行的要求:层次的数目不能超过N层,并且每一层中的多边形数量不能超过M个。
5.如权利要求4所述的方法,其特征在于,采用以下无冲突分组槽调度策略保证槽中数据被合理发送至绘制端并满足所述限制: A)如果在添加新层时层次的数量已经达到N层,那么首先将最底层槽中的所有多边形作为一个基本单元,发送到绘制管线中,然后将次底层作为新的最底层,各层顺次下移,最后在顶层再添加最新层; B)设置每一层所对应的无冲突分组槽中的空槽位置的个数为M,如果在向某一个第i层次添加了一个多边形之后该层次中包含的多边形达到了 M个,此时该层分组槽中的空槽数目为O,则从最底层到当前第i层的所有槽以及槽中所包含的所有多边形全部发送到绘制管线中,每一层中的所有多边形作为一基本单元将执行后续的计数和填充操作,然后将该层的下一层即第i+Ι层作为新的最底层,第i+Ι层之上的所有层顺次下移; C)输入流中如果出现非多边形图元,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作,将所有非多边形图元从输入中取出,一起送至绘制管线,然后清空无冲突分组槽,继续处理剩余多边形;D)如果A),B),C)中的条件均不满足,但是输入流中的所有多边形均已被处理进入分组槽中,则将所有的无冲突分组槽中的多边形全部发送到绘制管线中,每一层中的所有多边形作为一个基本单元将执行后续的计数和填充操作,然后调度算法结束。
6.如权利要求1所述的方法,其特征在于,步骤2)所述执行三角扇化和两遍分别具有计数和填充含义的GPU绘制的步骤包括: 2.1)接收到从无冲突分组槽发送过来的作为一个单元的无冲突关系的多边形集合,为该多边形集合关联一个模板缓冲区或者累积缓冲区,以此缓冲区作为为第一步计数绘制的目标和第二步填充绘制的测试依据; 2.2)对每个任意形状的多边形进行如下处理:对多边形中的每个闭环,以环中的任意一个顶点为轴,按照顶点的排列顺序依次向其他顶点连线,构成一个辐射状的三角形扇网格,如果多边形中含有多个闭环则形成了多个独立无关的三角形扇网格; 2.3)进行第一遍具有计数含义的绘制:对一个单元中的每个多边形闭环构造出的三角形扇网格并行地进行纯几何的绘制,绘制采用填充模式,此时色彩缓冲关闭,绘制结果写入并保存到步骤2.1)关联的缓冲区中,在该缓冲区中被三角形覆盖到奇数次的点是位于多边形内部的点,覆盖到偶数次的点是多边形外部,或者是多边形内部的空洞区域; 2.4)进行第二遍具有填充含义的绘制:同时对一个单元中的每个多边形闭环构造出的三角形扇网格并行地进行正常的可视化绘制,或者以多边形的包围盒替代三角扇网格进行绘制,绘制采用填充模式,此时色彩缓冲开启并打开模板缓冲或者累积缓冲测试,只有落入到缓冲区中并且计数为奇数次的像素才能通过测试,如果所需要绘制的多边形图元为纹理填充模式,则需要计算纹理坐标并进行相应纹理映射,最终得到该组图元的可视化结果; 2.5)清空模板缓冲或`者累积缓冲区; 2.6)如果还有尚未处理的无冲突分组槽及其多边形集合,则转入步骤2.1)继续处理,否则可视化算法结束。
7.如权利要求1所述的方法,其特征在于:进行第二遍具有填充含义的绘制时,生成的纹理坐标符合以下条件: a)纹理坐标在相邻的瓦片之间不能出现跳变,以实现相邻瓦片的无缝拼接; b)任何一个点在屏幕空间上的坐标和它的纹理坐标在小数部分应当相同,使得纹理图像的每个像素刚好覆盖屏幕空间的一个像素; c)两个点如果屏幕空间坐标的X分量相同,那么他们的纹理坐标的X分量也相同;y分量同理; d)任何两个点在屏幕空间中的距离和它们在纹理空间中的距离相等。
【文档编号】G06T1/00GK103700060SQ201310738008
【公开日】2014年4月2日 申请日期:2013年12月26日 优先权日:2013年12月26日
【发明者】李胜, 徐泽骅, 汪国平 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1