二维矢量实线在三维场景中的视觉误差消除方法转让专利

申请号 : CN201510402203.8

文献号 : CN105023288B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 佘江峰谈心郭星辰谈俊忠刘建龙

申请人 : 南京大学

摘要 :

本发明公开一种二维矢量实线在三维场景中的视觉误差消除方法,主要解决二维线状符号贴合渲染到三维地形表面过程中存在的矢量实线过细造成的断续消失现象、矢量实线边界的锯齿走样现象、矢量实线宽度不随场景缩放变化的现象等问题。包括如下主要步骤:根据矢量实线宽度对其面状化;利用投影反算方法计算屏幕像素在二维空间的覆盖范围;根据像素的二维空间覆盖范围与矢量实线面域的空间位置关系将像素进行分类,对与矢量实线的面域边界存在相交关系的这部分像素进行多重采样处理;判断采样点是否位于矢量实线的面域内部,根据判断结果决定采样点着色,利用采样点色彩混合值替换相应像素的屏幕色彩缓存值。

权利要求 :

1.一种二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,包括如下步骤:第一步:根据矢量实线宽度,对其进行面状化处理,生成矢量实线的面域;

第二步:利用投影反算方法计算各个屏幕像素在二维矢量平面上的投影覆盖范围;

第三步:根据像素在二维矢量平面上的投影覆盖范围与矢量实线面域的空间位置关系将像素分类,包括“与矢量实线面域的边界相交”,位于“矢量实线面域的内部”和位于“矢量实线面域的外部”三类;

第四步:对于“与矢量实线面域的边界相交”的像素,在其投影覆盖范围内进行多重采样,根据每个采样点与矢量实线面域的位置关系得到各采样点的色彩值,利用采样点色彩混合值替换像素的色彩值;

第五步:对于位于“矢量实线面域的内部”的像素,用矢量实线的色彩替换该像素色彩;

对于位于“矢量实线面域的外部”的像素,不做色彩修改。

2.根据权利要求1所述的二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,所述第一步中的对矢量实线进行面状化处理的方法,包括如下步骤:(1.1)根据矢量实线宽度,在二维平面内生成位于矢量线两侧与其等长的平行线,为每根平行线生成指向该矢量线的法向量;

(1.2)延长或打断平行线确保每根线段首尾相连;

(1.3)将两侧平行线封闭成多边形,并为封闭线也生成法向量。

3.根据权利要求1所述的二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,所述第四步中,具体包括如下步骤:(4.1)对于“与矢量实线面域的边界相交”的像素,将与其相交的所有矢量实线面域的边界线段保存在为该像素建立的“相交折线列表”中;

(4.2)将该像素在二维矢量平面内的不规则投影覆盖范围作为采样空间,使用二维线性插值计算出多个均值采样点的二维坐标;

(4.3)对于每个采样点,根据采样点二维坐标及所对应的像素的“相交折线列表”判断该采样点是否位于矢量实线面域的内部,若在,该采样点的色彩值设为矢量色彩值,若不在,该采样点的色彩值为对应像素色彩缓存中的原始色彩值;

(4.4)将像素对应的各采样点的色彩值求平均,得到像素的色彩值。

4.根据权利要求3所述的二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,所述步骤(4.3)中的判断采样点是否位于矢量实线面域的内部时,首先,遍历采样点所属像素的“相交折线列表”,排除列表中采样点到折线的垂足点位于折线延长线上的“不相关”折线;然后,对“相交折线列表”中排除了“不相关”折线后的“相关”折线进行遍历,判断采样点是否位于矢量实线面域的内部。

5.根据权利要求4所述的二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,对“相关”折线进行遍历,判断采样点是否位于矢量实线面域的内部的方法,包括如下步骤:(a)为采样点S定义一个“特征值”,用来记录多条折线与采样点相关的情况;

(b)对于一条折线AB,其中A、B为两端点,计算向量SA与SB的向量和SD,利用余弦定理计算出向量SD与折线AB的法向量n的夹角余弦值;

(c)若步骤(b)得到的余弦值为正,则FLAG减一,若为负,则FLAG值加一;

(d)遍历完成后,若FLAG值大于0,该采样点的色彩值设为所在的矢量色彩值;若小于等于0,设为像素在色彩缓存中的原值。

6.根据权利要求1所述的二维矢量实线在三维场景中的视觉误差消除方法,其特征在于,整个方法的实现采用的GRID-BLOCK-THREAD三层架构来进行多层次的并行计算,第二步和第三步中的像素操作放在多个GRID和BLOCK中同时进行,第三步中的采样点操作放在多个THREAD中同时进行。

说明书 :

二维矢量实线在三维场景中的视觉误差消除方法

技术领域

[0001] 本发明涉及计算机应用、计算机图形学和地理信息技术领域,具体涉及在渲染过程中减少或消除二维矢量实线在三维场景中的视觉误差以及失真现象的算法,在确保二维矢量实线与三维地表之间相互拓扑关系表达的准确性和严密性基础上,提升三维地理信息系统使用者的视觉观感,增强三维场景中地图符号对地理现象的选择性的抽象增强表达能力,使其欲传达的重点信息内容更为准确和突出。

背景技术

[0002] 由Mikael Vaaraniemi等人于2011年在《High-Quality Cartographic Roads on High-Resolution DEMs》(高分辨率DEM基础上的高质量道路符号渲染)中提出,二维矢量要素在三维地表的贴合渲染算法从原理上分为三类:基于纹理映射的渲染方法、基于几何插值的渲染方法和基于屏幕空间的渲染方法。
[0003] 其中,基于纹理映射的渲染方法思想是将矢量数据通过实时或者预处理的方式栅格化到一张二维图像上,然后将其作为标准纹理直接映射到地形表面,此类方法受地形精度限制很容易出现严重走样现象;基于几何插值的渲染方法思路是为二维矢量建立三维模型,使其与地形的精确几何匹配,此类方法在地形细节层次(Level Of Detail,LOD)变换时很可能出现矢量悬浮、穿刺于地表的不真实现象;基于屏幕空间的渲染方法本质上是逐一处理显示设备屏幕上所有的像素,判断其应该显示地形、矢量或其他要素(背景,模型等)的颜色,而达到矢量紧密贴合在地表的视觉效果,此类方法相比前两种具有渲染精度高达一个屏幕像素,不会出现严重走样或悬浮穿刺等渲染误差,以及实时渲染效率不受地形模型大小与复杂度影响等优点。
[0004] 目前为止,基于屏幕空间的渲染方法主要有两种,分别是基于模板阴影体的渲染方法和基于屏幕空间投影反算的渲染方法。该类方法的在高渲染精度和独立于地形模型这两点上较纹理、几何方法更为先进。
[0005] ●基于模板阴影体的渲染方法
[0006] Schneider和Klein(2007)在文章“Efficient and accurate rendering of vector data on virtual landscapes”(一种将矢量精确渲染到虚拟地表的方法)中提出了结合阴影体算法(Stefan Brabec and Hans-peter Seidel,2003)和模板缓存技术(OpenGLTM,https://www.opengl.org/)的模板阴影体方法。
[0007] 该方法核心思想是将矢量符号通过正射投影在三维地形表面生成的阴影,并将该阴影范围当作矢量的贴合渲染结果。具体实现步骤有三步:首先将面状化的矢量数据沿垂直投影方向扩展为多面体;然后利用生成的多面体通过阴影体算法在模板缓存中生成掩模;最后将掩模添加到三维场景中,完成代表相应矢量数据的屏幕像素着色。在第二步中,作者通过逐像素中心的光线投射判断与地形表面交点是否处在步骤一生成的阴影体内部,以此决定掩膜中的像素颜色。然而,仅凭像素中心点判断难以准确反馈像素内的矢量分布情况,尤其当矢量线要素宽度小于一个像素时,易发生矢量线断续、消失的现象,影响抽象化地理现象的认知与区分。同时,矢量边缘还会发生一个像素的锯齿走样现象,影响视觉观感。另外,将矢量扩展成多面体大大增加了需要处理的数据量与数据复杂度,使光线投射和碰撞检测效率下降,在原始矢量数据达到一定规模后运行效率变得很低。
[0008] ●基于屏幕空间投影反算的渲染方法
[0009] 佘江峰等人在已公开发明专利“矢量实线与三维地形的并行贴合渲染方法”(CN104318605A)中提出基于屏幕空间投影反算的渲染方法。
[0010] 该方法的核心思想是,将计算机图形学中基本的三维场景屏幕投影过程反向,逐一计算屏幕像素在二维矢量平面的投影范围,判断与矢量要素的位置关系来决定着色。具体步骤为:检测地形轮廓线并剔除轮廓线上可能会被误判的像素;为矢量数据建立空间索引;将屏幕像素通过当前视点位置及相机参数逐一计算出其在三维地表的覆盖范围,再通过正射投影得到其在二维矢量平面的覆盖范围,若相交,则将该像素色彩值替换为矢量颜色;利用形态学方法对线要素加宽;对地形和矢量进行深度测试,并保留深度值小的色彩值进行屏幕渲染。在第三步中,像素(i,j)四角点由(i,j)(i+1,j)(i,j+1)(i+1,j+1)四个像素中心点替代,来避免投影反算过程产生的叠置与缝隙,渲染结果精度高且贴合紧密。然而,该方法采用的矢量线宽度不随场景缩放实时变化,对于固定线宽的地图矢量线是适合的,但不适合表达依场景缩放而变化线宽的矢量线,且矢量要素边缘存在的锯齿走样现象没有被解决。另外,基于CPU-GPU协作的并行异构计算模式仍存在性能提升的空间。

发明内容

[0011] 发明目的:针对现有的若干种基于纹理的、几何插值的渲染技术和两种基于屏幕渲染技术存在的不足,本发明旨在提供一种新的优化算法,将二维矢量实线在三维地形表面进行贴合渲染过程中存在的悬浮、穿刺、走样、断续、失真等所有可能出现的视觉误差予以消除,在抽象表达地理现象的基础上最大程度地贴近真实,优化用户视觉观感。
[0012] 技术方案:为实现上述发明目的,本发明采用如下技术方案:
[0013] 一种二维矢量实线在三维场景中的视觉误差消除方法,可以通过优化的CPU+GPU异构计算方式实现包含二维矢量实线符号的三维地理场景并行渲染过程,包括如下步骤:
[0014] 第一步:根据矢量实线宽度,对其进行面状化处理,生成矢量实线的面域;
[0015] 第二步:利用投影反算方法计算各个屏幕像素在二维矢量平面上的投影覆盖范围;
[0016] 第三步:根据像素在二维矢量平面上的投影覆盖范围与矢量实线面域的空间位置关系将像素分类,包括“与矢量实线面域的边界相交”,位于“矢量实线面域的内部”和位于“矢量实线面域的外部”三类;
[0017] 第四步:对于“与矢量实线面域的边界相交”的像素,在其投影覆盖范围内进行多重采样,根据每个采样点与矢量实线面域的位置关系得到各采样点的色彩值,利用采样点色彩混合值替换像素的色彩值;
[0018] 第五步:对于位于“矢量实线面域的内部”的像素,用矢量实线的色彩替换该像素色彩;对于位于“矢量实线面域的外部”的像素,不做色彩修改。
[0019] 所述第一步中的对矢量实线进行面状化处理的方法,包括如下步骤:
[0020] (1.1)根据矢量实线宽度,在二维平面内生成位于矢量线两侧与其等长的平行线,为每根平行线生成指向该矢量线的法向量;
[0021] (1.2)延长或打断平行线确保每根线段首尾相连;
[0022] (1.3)将两侧平行线封闭成多边形,并为封闭线也生成法向量。
[0023] 所述第四步中,具体包括如下步骤:
[0024] (4.1)对于“与矢量实线面域的边界相交”的像素,将与其相交的所有矢量实线面域的边界线段保存在为该像素建立的“相交折线列表”中;
[0025] (4.2)将该像素在二维矢量平面内的不规则投影覆盖范围作为采样空间,使用二维线性插值计算出多个均值采样点的二维坐标;
[0026] (4.3)对于每个采样点,根据采样点二维坐标及所对应的像素的“相交折线列表”判断该采样点是否位于矢量实线面域的内部,若在,该采样点的色彩值设为矢量色彩值,若不在,该采样点的色彩值为对应像素色彩缓存中的原始色彩值;
[0027] (4.4)将像素对应的各采样点的色彩值求平均,得到像素的色彩值。
[0028] 所述步骤(4.3)中的判断采样点是否位于矢量实线面域的内部时,首先,遍历采样点所属像素的“相交折线列表”,排除列表中采样点到折线的垂足点位于折线延长线上的“不相关”折线;然后,对“相交折线列表”中排除了“不相关”折线后的“相关”折线进行遍历,判断采样点是否位于矢量实线面域的内部。
[0029] 本发明的创新点在于:对三维场景中线状要素进行面状化处理,形成视觉等价的封闭多边形(即矢量实线面域),使其宽度可以随场景缩放而变化,更具实际感受,使得在具有基于屏幕渲染方法的共性特征“矢量在三维地形表面没有悬浮、穿刺现象”的基础上,还消除了其他基于屏幕的方法可能产生的“矢量边缘的走样现象”;本发明具有高于一个屏幕像素的渲染精度;并且通过一个适应算法本身的采样点与像素空间关系的判断过程,去除了不必要的计算操作,提高了渲染性能。
[0030] 本发明方法通过投影反算得到屏幕像素在二维矢量平面内的覆盖范围,并在此范围内进行多重采样,尽可能地保留了像素内部的矢量分布信息,避免了因中心点单一采样所造成的矢量信息被忽略(这是造成细线断续现象的关键原因)或相邻像素间色彩没有过渡(这是造成线边缘锯齿走样现象的原因)的不合理效果。
[0031] 考虑到如果采用直接在屏幕上进行多重采样的做法,各个采样点会共享所属像素的单一深度值(这与实际情况不符,因为各个采样点的空间位置不同,其深度也不同),投影反算到二维矢量平面后会发生空间位置的偏移,造成采样不准,因此,方法将采样空间由屏幕转换到二维矢量平面,采用二维线性插值的方法计算像素不规则投影范围内的采样位置。
[0032] 考虑到二维矢量线的数量实际上是有限的,其在屏幕上的空间覆盖度也是有限的,如果将多重采样应用到所有的屏幕像素,计算量会非常大,交互性能将大大降低。因此,在二维矢量平面内,根据矢量实线面域与投影反算后的各个屏幕像素范围的空间位置关系,将屏幕像素分成三类:位于矢量范围以外,位于矢量范围以内,与矢量边缘相交;前两类像素的处理比较简单直接,算法重点是识别和处理第三类像素,以消除矢量线断续和走样现象,如此大大减少了不必要的计算性能消耗。
[0033] 基于屏幕渲染方法的实时交互过程,在相同的硬件条件下,其性能并不受地形模型大小及其LOD复杂程度的影响,仅受矢量数据大小影响。因此,尽量减少实时渲染中对矢量数据的遍历次数可以有效提升性能。在本发明中,要获得各个像素与像素内各个采样点与矢量线的位置关系信息,仅需对整个矢量遍历一次,具体做法是为每一个需要多重采样的像素构建“相交折线列表”,将各个采样点着色判断所需要的共性信息(与像素相交的矢量实线面域的边界及其法向量等)缓存下来,以此避免对所有矢量要素的重复处理以及遍历。对于像素的每个采样点,在列表中找出该点在折线上的垂足位于折线范围内的这一类折线,这些折线称为“相关”折线,根据其指向矢量实线面域内部的法向量可以判断采样点是否位于矢量实线面域范围内,据此可以决定采样点色彩值,而像素色彩值则可以根据该象素内的多个采样点进行色彩值的平均得到。
[0034] 综上,本发明具有如下优点:
[0035] 1、本发明通过对屏幕投影反算到二维矢量平面的像素覆盖范围进行多重采样,尽可能地避免现有方法中使用的单一中心采样所造成的视觉误差,是一种在理论基础与技术路线上都有创新的矢量要素的屏幕渲染优化算法;
[0036] 2、与现有技术相比,使用本发明方法渲染得到的矢量实线在三维地表的贴合更为紧密,有效消除了悬浮、穿刺、断续现象,同时也消除了矢量边缘的走样现象,并使得矢量的宽度可以随着场景缩放而实时变化;
[0037] 3、矢量的渲染精度可以达到高于一个屏幕像素;
[0038] 4、本发明使用了一个适合算法自身的方法来判断采样点是否位于矢量实线面域的内部,该方法减少了对矢量实线的遍历次数,降低了矢量数据集大小对基于屏幕的矢量渲染方法性能的负面影响,加快了实时交互性能。

附图说明

[0039] 图1为本发明方法的总体流程图;
[0040] 图2为基于实际宽度的矢量实线面状化过程示意图;
[0041] 图3为基于“屏幕像素投影反算”的优化算法原理示意图;
[0042] 图4为多重采样方法消除断续走样现象示意图;
[0043] 图5为采样点是否位于矢量实线面域的内部的快速判断方法示意图;

具体实施方式

[0044] 下面结合具体实例,进一步阐述本发明,应理解这些实例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
[0045] 如图1所示,本发明实例公开的一种二维矢量实线在三维场景中的视觉误差消除方法,主要步骤如下:
[0046] 第一步:读取地形、矢量数据,并对矢量线根据其宽度进行面状化处理。相比没有宽度的矢量线符号,具有宽度的面状化矢量线对三维场景中道路、水系等表达更容易形成具象感受,其宽度可随场景缩放而变化,与地形的视觉贴合感更为强烈。
[0047] 图2为矢量线面状化的具体过程。对于一条矢量实线(如2a所示),根据其实际宽度,先计算生成位于矢量实线各个线段两侧的平行线段(如图2b所示);打断或延长相邻折线段保证其首尾连接(如图2c所示);为每条已生成两侧边缘的矢量线,连接两侧边缘保证其封闭性(如图2d所示);为每条折线生成指向封闭多边形内部的法向量(如图2e所示);为每条边缘折线构建包围盒,对超过指定长度的折线进行破碎化以便建立比较均匀的空间索引,加快矢量遍历过程。
[0048] 第二步:计算屏幕像素在二维矢量平面内的投影覆盖范围。此类计算方法具有多样性,此处采用佘江峰等人在已公开发明专利“矢量实线与三维地形的并行贴合渲染方法”(CN104318605A)中使用的计算屏幕像素在二维平面上的投影范围的方法。这是为避免像素四角点采用单深度值计算三维坐标造成的误差,而采用像素(i,j)(i,j+1)(i+1,j)(i+1,j+1)的四个中心点代替像素(i,j)的四角点,并通过当前视点位置和相机参数计算像素在二维矢量平面内的不规则覆盖范围。后续步骤中的多重采样将在该范围内进行(如图3所示)。
[0049] 第三步:根据矢量实线面域与像素投影范围的空间位置关系对像素进行分类。首先,对于像素的投影到二维矢量平面的不规则四边形,利用四叉树索引和最小包围盒技术遍历整个矢量面域,判断其是否与某些面域边缘相交,据此将像素分成三类:位于矢量面域的内部、位于矢量面域的外部、与矢量面域的边缘相交。算法仅需要对上述第三类像素进行多重采样优化,因为仅有这类像素会使渲染结果产生断续和走样现象。图4为本算法中多重采样消除断续和走样的原理及其预期效果。如图所示,4a为一条宽度小于一个像素的待渲染的矢量实线,4b、4c为传统中心采样方法的渲染结果,产生了明显断续,而4d-4f为本算法的过程,仅将4d中分类为“P”的像素进行多重采样,得到的结果中,断续、走样现象可被消除。
[0050] 第四步:对“与矢量实线面域的边界相交”的这部分像素点(即4d中所示的“P”类像素)进行多重采样。由于投影到二维矢量平面的像素覆盖范围是不规则四边形,所以算法需要使用二维线性插值的方法在不规则四边形内生成均值采样点,保证采样点均匀分布。
[0051] 在第三步分类中,将与各像素投影范围相交的矢量实线面域的边界线段保存在为对应像素建立的“相交折线列表”中,以在判断采样点是否位于矢量实线面域内部时,避免对所有矢量进行重复遍历。列表中每一条折线需要储存其两点的二维位置信息和指向面域内部的法向量信息。
[0052] 对于每个采样点,算法根据其是否位于矢量实线面域内部,决定该点的色彩值。本算法制定了一套快速判断方法,仅依据采样点二维坐标及其所在像素的“相交折线列表”即可得出采样点是否位于矢量实线面域内部,而无需对所有矢量进行多次的重复遍历。具体分为如下两步:
[0053] a.在“相交折线列表”中排除与采样点“不相关”的折线;
[0054] b.根据“相交折线列表”中其它折线的法向量判断采样点是否位于矢量实线面域内部。
[0055] 上述a、b步骤计算过程均以实例说明。如图5a所示,对于一个与矢量实线面域的边界相交的屏幕像素P,其在二维矢量平面内的投影范围为P’,S为P’由二维线性插值得到的一个均值采样点,AB为其“相交折线列表”中的一条折线,n为AB指向矢量面域内部的法向量。
[0056]
[0057] 上述a步骤中,“不相关”的定义规则为采样点在折线上的垂足位于折线的延长线上(即不在折线范围内)。这种情况下,折线只是与像素相交,而并不会对采样点的位置判断有所贡献,将这部分折线预先排除,可减少b步骤的计算量,且不会导致判断结果的错误。如图5b所示,H为S在AB上的垂足点,计算AB和HS所在直线交点,判断其是否在AB范围内:
[0058]
[0059]
[0060] 上述步骤b,在步骤a排除部分折线后对剩余折线进行。先为采样点定义一个“特征值”FLAG,用来判断多条折线与采样点“相关”的情况。计算向量SA与SB的向量和SD,利用余弦定理计算出向量SD与法向量n的夹角余弦值,如果该值为正,则FLAG减一,如果为负,则FLAG值加一。
[0061]
[0062]
[0063] 根据FLAG值的正负返回该点色彩值,若FLAG大于0,该采样点返回所在的矢量色彩值;若小于等于0,返回像素在色彩缓存中的原值。
[0064] 第五步,将第四步处理好的“与矢量面域边缘相交”的像素中的各采样点的色彩值求平均,并用以替换屏幕色彩缓存中对应像素的色彩值。对于那些完整落在矢量面域范围内的像素,直接将该像素色彩缓存值替换为矢量色彩;对于那些与矢量面域不存在相交关系的像素,不做任何处理。整个屏幕判断完成后将新的色彩缓存在屏幕上显示出来,则完成了包含二维矢量实线的三维场景渲染过程。
[0065] 在优化算法的整个实现过程中,针对每个像素进行的计算过程具有同质性和可分块性,可以采用GPU并行的计算方式提升算法的运行效率,因此在系统架构方面采用了CPU+GPU异构计算模式(如图1)。特别地,对于同一像素内各个采样点的判断和计算过程也具有同质性,因此算法采用 CUDATM的GRID-BLOCK-THREAD三层架构来进行多层次的并行计算:像素操作(第二步和第三步)放在了多个GRID和BLOCK中同时进行,而采样点操作(第四步)放在多个THREAD中同时进行。经试验,该基于CUDATM三层架构的CPU-GPU并行异构计算模式将该算法的运行效率提升到了三维可交互的水平。