一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于GPU的实时网格轮廓向量化与渲染系统

2022-07-02 05:03:05 来源:中国专利 TAG:

基于gpu的实时网格轮廓向量化与渲染系统
技术领域
1.本发明涉及实时渲染和风格化绘制的技术领域,尤其是指一种基于gpu的实时网格轮廓向量化与渲染系统。


背景技术:

2.轮廓线在艺术创作中起着重要作用:轮廓揭示了绘制对象的基本形状,并且风格化的轮廓线条可以达到富有表现力的视觉效果。在风格化绘制的领域,从三维网格提取轮廓并绘制线条一直是一个重要的技术点。实时应用中的大多数轮廓渲染系统都完全在gpu上实现。一个原因是gpu的图形性能普遍比cpu更优越。另一个原因是网格轮廓的几何拓扑在相机和物体运动下会动态变化,如果在cpu端生成轮廓,则需要每帧都从内存更新轮廓数据到显存来供gpu渲染,所带来的延迟对于实时性能来说是无法承受的。然而,现有的基于gpu的实时轮廓绘制系统都无法将轮廓边/像素链接为笔划曲线。链接过程通常从一个元素(像素或网格边)开始,然后连接到其相邻元素。该链接将不断重复,直到到达一个奇点,该奇点处网格轮廓的可见性发生变化。当链接发生在图像空间(每个轮廓元素作为一个二维对象),该过程被称为向量化。向量化的迭代性质使它很难在gpu上得到并行化。
3.目前实时gpu轮廓渲染系统主要分为三类:1)基于图像滤镜的系统:使用片元着色器在几何缓存纹理上进行边缘检测来计算几何属性(如深度,法线,物件标签)在图像空间的梯度值。如果纹理像素的梯度高于指定的阈值,则将其视为轮廓上的像素2)基于三维网格的系统:如果三角网格一条边的两个相邻面具有相反的视点朝向,则该网格为轮廓边。3)基于顶点挤出的系统:根据顶点法向将顶点进行偏移;根据偏移之后的顶点绘制勾线。总体而言,现有基于gpu的轮廓渲染系统大都只能输出零散的轮廓元素,无法将轮廓元素连接成线条曲线。这意味着目前的系统无法充分提取网格轮廓的几何与拓扑性质,从而导致轮廓渲染的视觉效果受到很大的限制。另一方面,即使目前在cpu端有系统能够从轮廓提取线条,其性能无法对日益复杂的实时渲染场景提供有效支持。


技术实现要素:

4.本发明的目的在于克服现有技术的缺点与不足,提出了一种基于gpu的实时网格轮廓向量化与渲染系统,突破传统gpu网格轮廓渲染系统无法提取线条路径的局限性,充分利用gpu的性能和网格轮廓的性质,通过基于三维网格的轮廓提取和基于图像空间的向量化算法,从而达到实时的轮廓线条提取。
5.为实现上述目的,本发明所提供的技术方案为:基于gpu的实时网格轮廓向量化与渲染系统,包括:
6.网格导入模块,用于从本地网格模型文件中提取出网格数据并进行预处理;
7.光栅化模块,利用轮廓定义提取网格轮廓,利用扫描转换将网格轮廓转换为片元,利用深度缓冲和深度测试对片元进行遮挡剔除,并将未被遮挡的片元整合为一组轮廓像素;
8.向量化模块,利用并行化的potrace算法,围绕轮廓像素得到一组封闭路径;
9.线条提取模块,用于依据网格轮廓的几何信息来分割封闭路径,并提取出一组能反映场景遮挡关系的线条路径;
10.线条渲染模块,用于将一组线条路径渲染为一组具有可控样式的二维线条。
11.进一步,所述网格导入模块具体执行以下操作:
12.1)从本地读取所需网格数据,包括obj、fbx格式,其中,网格数据包括面到顶点索引数组fv、顶点坐标数组pv以及顶点法线数组nv;
13.2)对步骤1)导入的网格数据进行预处理,并输出边到面索引数组ef、边到顶点索引数组ev、面法线数组nf。
14.进一步,所述光栅化模块包括轮廓提取模块、扫描转换模块和深度测试模块,其中:
15.gpu线程并行处理所有网格边,根据如下定义判断网格边是否为轮廓:
16.(f0,f1)=ef[e]
[0017]
(nf[f0]
·
v)(nf[f1]
·
v)<0
[0018]
式中,e为网格边,从索引数组ef中所得的三角面f0,f1与e相邻,从面法线数组nf中所得nf[f0],nf[f1]分别为f0,f1的面法线,v为e上任意点到视点之向量;
[0019]
利用stream compaction算法从网格边中剔除掉非轮廓边;
[0020]
所述扫描转换模块用于将轮廓提取模块输出的轮廓边转换为一组片元,每个片元为像素大小且带有轮廓几何数据的二维对象,包括以下步骤:
[0021]
利用并行的bresenham算法将每条轮廓边ec扫描转换为一组片元;
[0022]
利用对轮廓边两个顶点进行透视插值来计算片元的属性,其中每个片元的属性包含有片元所属轮廓边的屏幕切向量、插值后的顶点法线和深度信息;
[0023]
所述深度测试模块对扫描转换模块转换所得的片元进行遮挡剔除并提取出轮廓像素,包括以下步骤:
[0024]
利用场景深度缓冲对片元进行第一次可见性测试,如果片元3
×
3邻域中超过两个像素的深度值大于该片元,则该片元通过第一次可见性测试;
[0025]
利用硬件深度排序对通过第一次可见性测试的片元进行第二次可见性测试,具有最小深度的片元会被转换为图像中的轮廓像素。
[0026]
进一步,所述向量化模块包括路径分解模块和路径链接模块,其中:
[0027]
所述路径分解模块利用光栅化模块输出的轮廓像素提取像素边,利用potrace算法建立像素边之间的邻接关系,并按照像素边之间的邻接关系输出一组环状链表,包括以下步骤:
[0028]
gpu每个线程对应一个或多个轮廓像素并观察其3
×
3邻域,对邻域每一个与其相邻的背景像素,将相邻的边标记为像素边;
[0029]
利用potrace算法为每条像素边确定朝向,保证其左侧具有轮廓像素,在右侧具有背景像素,或是其左侧具有背景像素,在右侧具有轮廓像素;
[0030]
利用potrace算法对共享像素顶点的每对像素边建立邻接关系,并按照邻接关系输出一组环状链表,链表中每个节点对应一条像素边;
[0031]
所述路径链接模块利用并行的list ranking算法将路径分解模块输出的一组环
状链表转换为一组线性列表,包括以下步骤:
[0032]
利用list ranking算法为路径分解模块输出的环状链表挑选出头节点;
[0033]
利用list ranking算法序列化环状链表,每个链表中的像素边被按顺序排列到一个列表,并且所得的头节点为该列表的起始像素边。
[0034]
进一步,所述线条提取模块从向量化模块输出的线性列表中提取出线条路径,包含以下步骤:
[0035]
1)利用局部曲线拟合为所有像素边计算近似的切线方向;
[0036]
2)使用光栅化模块输出的轮廓像素分析所有像素边,若像素边的切线与其周边的轮廓像素的加权平均切线都具有相同朝向,则标记像素边为1,否则0;
[0037]
3)按照经过步骤2)处理后的标记,利用gpu分段扫描算法将向量化模块输出的每个列表分割为一组子列表,将标记为1的每个子列表中每个像素边的中点作为路径顶点,按列表中像素边的顺序排成点列作为线条路径。
[0038]
进一步,所述线条渲染模块将线条路径渲染至屏幕,包含以下步骤:
[0039]
1)使用线条提取模块输出的线条路径计算线条网格,其中线条网格能够按每个路径点放置一个笔刷实例来计算,也能够通过将线条路径扩展而得;
[0040]
2)将经过步骤1)计算的线条网格通过gpu着色器渲染至屏幕,屏幕线条的风格样式由步骤1)所输出线条网格的形式以及gpu着色器的实现共同决定,其中gpu着色器接收线条网格的顶点数据,并按照其实现逻辑将顶点转换为屏幕像素,输入的顶点数据包含其屏幕坐标以及其它用于线条绘制的顶点属性,包括笔刷纹理坐标、线条颜色和透明度。
[0041]
本发明与现有技术相比,具有如下优点与有益效果:
[0042]
1、输出反映遮挡关系的轮廓线条,为风格化的线画图绘制提供了技术支撑。
[0043]
2、利用gpu的并行计算能力,整个系统达到了实时性能。
附图说明
[0044]
图1为本发明系统各个模块的关系示意图。
[0045]
图2为光栅化模块的流程示意图。
[0046]
图3为向量化模块的流程示意图。
[0047]
图4为线条提取模块的流程示意图。
具体实施方式
[0048]
下面结合具体实施例对本发明作进一步说明。
[0049]
本实施例提供了一种基于gpu的实时网格轮廓向量化与渲染系统,是使用c#和hlsl语言开发的可在windows设备上运行的实时网格轮廓向量化与渲染系统,系统各模块间关系如图1所示,系统流程图如图2,3,4所示。它包括有以下功能模块:
[0050]
网格导入模块,用于从本地网格模型文件中提取出网格数据并进行预处理;
[0051]
光栅化模块,利用轮廓定义提取网格轮廓,利用扫描转换将网格轮廓转换为片元,利用深度缓冲和深度测试对片元进行遮挡剔除,并将未被遮挡的片元整合为一组轮廓像素;
[0052]
向量化模块,利用并行化的potrace算法,围绕轮廓像素得到一组封闭路径;
[0053]
线条提取模块,用于依据网格轮廓的几何信息来分割封闭路径,并提取出一组能反映场景遮挡关系的线条路径;
[0054]
线条渲染模块,用于将一组线条路径渲染为一组具有可控样式的二维线条。
[0055]
进一步,所述网格导入模块具体执行以下操作:
[0056]
1)从本地读取所需网格数据,包括obj、fbx格式,其中,网格数据包括面到顶点索引数组fv、顶点坐标数组pv以及顶点法线数组nv;
[0057]
2)对步骤1)导入的网格数据进行预处理,并输出边到面索引数组ef、边到顶点索引数组ev、面法线数组nf。
[0058]
进一步,所述光栅化模块从网格导入模块所加载的网格中提取轮廓像素,如图2所示,包括轮廓提取模块、扫描转换模块和深度测试模块,其中:
[0059]
所述轮廓提取模块利用网格导入模块所得的网格数据,提取出一组网格边作为轮廓,包括以下步骤:
[0060]
gpu线程并行处理所有网格边,根据如下定义判断网格边是否为轮廓:
[0061]
(f0,f1)=ef[e]
[0062]
(nf[f0]
·
v)(nf[f1]
·
v)<0
[0063]
式中,e为网格边,从索引数组ef中所得的三角面f0,f1与e相邻,从面法线数组nf中所得nf[f0],nf[f1]分别为f0,f1的面法线,v为e上任意点到视点之向量;
[0064]
利用stream compaction算法从网格边中剔除掉非轮廓边;
[0065]
所述扫描转换模块用于将轮廓提取模块输出的轮廓边转换为一组片元,每个片元为像素大小且带有轮廓几何数据的二维对象,包括以下步骤:
[0066]
利用并行的bresenham算法将每条轮廓边ec扫描转换为一组片元;
[0067]
利用对轮廓边两个顶点进行透视插值来计算片元的属性,其中每个片元的属性包含有片元所属轮廓边的屏幕切向量、插值后的顶点法线和深度信息;
[0068]
所述深度测试模块对扫描转换模块转换所得的片元进行遮挡剔除并提取出轮廓像素,包括以下步骤:
[0069]
利用场景深度缓冲对片元进行第一次可见性测试,如果片元3
×
3邻域中超过两个像素的深度值大于该片元,则该片元通过第一次可见性测试;
[0070]
利用硬件深度排序对通过第一次可见性测试的片元进行第二次可见性测试,具有最小深度的片元会被转换为图像中的轮廓像素。
[0071]
如图3所示,所述向量化模块包括路径分解模块和路径链接模块,其中:
[0072]
所述路径分解模块利用光栅化模块输出的轮廓像素提取像素边,利用potrace算法建立像素边之间的邻接关系,并按照像素边之间的邻接关系输出一组环状链表,包括以下步骤:
[0073]
gpu每个线程对应一个或多个轮廓像素并观察其3
×
3邻域,对邻域每一个与其相邻的背景像素,将相邻的边标记为像素边;
[0074]
利用potrace算法为每条像素边确定朝向,保证其左侧具有轮廓像素,在右侧具有背景像素,或是其左侧具有背景像素,在右侧具有轮廓像素;
[0075]
利用potrace算法对共享像素顶点的每对像素边建立邻接关系,并按照邻接关系输出一组环状链表,链表中每个节点对应一条像素边;
[0076]
所述路径链接模块利用并行的list ranking算法将路径分解模块输出的一组环状链表转换为一组线性列表,包括以下步骤:
[0077]
利用list ranking算法为路径分解模块输出的环状链表挑选出头节点;
[0078]
利用list ranking算法序列化环状链表,每个链表中的像素边被按顺序排列到一个列表,并且所得的头节点为该列表的起始像素边。
[0079]
所述线条提取模块从向量化模块输出的线性列表中提取出线条路径,如图4所示,图中空心箭头表示轮廓像素的切线方向,实心箭头线表示从向量化模块输出的线性列表,其包含以下步骤:
[0080]
1)利用局部曲线拟合为所有像素边计算近似的切线方向;
[0081]
2)使用光栅化模块输出的轮廓像素分析所有像素边,若像素边的切线与其周边的轮廓像素的加权平均切线都具有相同朝向,则标记像素边为1,否则0;
[0082]
3)按照经过步骤2)处理后的标记,利用gpu分段扫描算法将向量化模块输出的每个列表分割为一组子列表,将标记为1的每个子列表中每个像素边的中点作为路径顶点,按列表中像素边的顺序排成点列作为线条路径。
[0083]
所述线条渲染模块将线条路径渲染至屏幕,包含以下步骤:
[0084]
1)使用线条提取模块输出的线条路径计算线条网格,其中线条网格能够按每个路径点放置一个笔刷实例来计算,也能够通过将线条路径扩展而得;
[0085]
2)将经过步骤1)计算的线条网格通过gpu着色器渲染至屏幕,屏幕线条的风格样式由步骤1)所输出线条网格的形式以及gpu着色器的实现共同决定,其中gpu着色器接收线条网格的顶点数据,并按照其实现逻辑将顶点转换为屏幕像素,输入的顶点数据包含其屏幕坐标以及其它用于线条绘制的顶点属性,包括笔刷纹理坐标、线条颜色和透明度。
[0086]
以上所述实施例只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献