一种基于二维和三维一体化矢量渲染引擎的装置转让专利

申请号 : CN201310596598.0

文献号 : CN103606184B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 贺楷锴张立周耀学卫东程方邓跃进宋爱红范业稳魏延峰朱伟奇张龙黄俊韬陈胜鹏许振华曹斌苏俊

申请人 : 武大吉奥信息技术有限公司

摘要 :

本发明公开了一种二维和三维一体化矢量渲染引擎的装置,所述引擎提供绘制原语转换功能,即将二维绘制原语转换成三维绘制原语,二维绘制原语是功能的输入,三维绘制原语是功能的输出,所述引擎完成二维矢量数据和三维矢量数据的渲染,三维矢量数据直接调用三维矢量渲染引擎完成渲染,二维矢量数据将经过一体化渲染引擎分线、面、图片和文字不同类型处理形成三维绘制原语,然后由三维矢量渲染引擎完成最终渲染。

权利要求 :

1.一种基于二维和三维一体化矢量渲染引擎的装置,其特征在于:所述装置包括二维和三维一体化矢量渲染引擎,提供绘制原语转换功能,即将二维绘制原语转换成三维绘制原语,二维绘制原语是功能的输入,三维绘制原语是功能的输出,所述引擎完成二维矢量数据和三维矢量数据的渲染,三维矢量数据直接调用三维矢量渲染引擎完成渲染,二维矢量数据将经过一体化渲染引擎分线、面、图片和文字不同类型处理形成三维绘制原语,然后由三维矢量渲染引擎完成最终渲染;所述引擎包括线渲染、面填充渲染、位图渲染和字体渲染,其中,所述线渲染,通过定义颜色、线宽、线型语义来渲染折线、曲线矢量数据;所述面填充渲染,通过定义填充类型、填充颜色语义来渲染面矢量数据;所述位图渲染,将位图数据渲染到特定范围内;所述字体渲染,将文字以特定的字体、大小渲染出来;所述的线渲染为线绘制原语转换根据颜色、线宽、线型转换为三维绘制原语,一个带颜色值的顶点数组和一个索引数组就是线绘制原语到三维绘制原语转换的结果,线原语转换过程需要根据线的类型转换线的端头为平头或者圆头,如果是圆头则需要插入多个顶点形成三角形扇形模拟端头的圆弧,相应的顶点和索引应加入顶点和索引数组形成更为复杂的三维渲染原语;对于多段折线也需要在线段间衔接处生成圆弧衔接的扇形,平角衔接类型的线型需要考虑线段夹角为锐角时会计算出的尖头。

2.根据权利要求1所述的装置,其特征在于:面渲染原语转换主要使用三角剖分算法实现,以面的轮廓线为基础将面剖分成若干镶嵌的三角形,所有这些镶嵌的三角形最终覆盖面的范围,面渲染原语转换输出的结果和线渲染原语转换的结果是一个带颜色值的顶点数组和一个索引数组;面颜色填充包括是纯色填充和渐变色填充,纯色填充时输出的三维渲染原语中顶点颜色值为相同的颜色值,渐变色填充时,在三角形剖分过程中添加若干以填充中心为圆心圆的辅助线,剖分出更为复杂的镶嵌三角形,并根据三角形顶点距离渐变色填充中心点的距离来计算剖分出来的三角形顶点的颜色值;基于路径的渐变色填充采用圆心渐变填充类似的方式,在剖分过程中添加若干的辅助线来加密剖分的三角形,根据到路径起点的距离计算剖分出来的三角形顶点颜色值。

3.根据权利要求1所述的装置,其特征在于:所述位图渲染原语的转换主要能力是换算出位图显示的矩形范围、以及该范围对应于位图上的纹理坐标。

4.根据权利要求1所述的装置,其特征在于:所述的字体渲染原语转换方法和面渲染原语转换相似,对于字体渲染过程来说,使用者输入的数据不是面范围,而是字体、颜色、字体大小、文字,排版布局信息,渲染引擎根据字体和字体大小从字体库中获取字体渲染的轮廓,通过面三角剖分算法形成字体渲染的三维渲染原语。

说明书 :

一种基于二维和三维一体化矢量渲染引擎的装置

技术领域

[0001] 本发明属于对地观测与导航技术领域,更具体是涉及计算机上二、三维空间矢量数据可视化过程中的渲染装置,可用于地理信息系统与服务的应用开发。

背景技术

[0002] 二、三维矢量渲染是计算机图形技术应用的一个重要方面。矢量渲染引擎是指将矢量数据以渲染原语渲染到位图或者显示设备上。二维矢量渲染引擎通过定义线宽、线型、颜色、填充类型等渲染原语来达到多样化渲染二维矢量数据的目的。三维矢量渲染引擎通过定义三角形、顶点索引、颜色、纹理坐标等渲染原语来达到多样化渲染三维矢量数据的目的。
[0003] 二维矢量渲染引擎,如GDI,GDI+,Agg,Skia,Cario等一般是基于CPU直接实现的,它们具备以二维渲染原语渲染矢量数据的能力。但受限于CPU整数运算器,基于CPU运算的二维矢量渲染引擎的图形渲染性能不如基于GPU的三维矢量渲染引擎。三维矢量渲染引擎,如OpenGL,Direct3D,OpenGLES,WebGL等都是基于GPU硬件实现的,它们具有非常高的渲染性能,更好的渲染效果,也更加节能。虽然各种三维引擎都是以三维矢量渲染原语为基础,但是不同的三维渲染引擎在调用接口上比较迥异。为了提高二维矢量渲染的性能,一些二维矢量渲染引擎也具备使用GPU硬件加速的能力,实际上是将三维矢量渲染引擎内置于二维矢量渲染引擎的内部,二维矢量渲染引擎将二维渲染原语转换成三维渲染原语并直接调用三维渲染引擎渲染出结果,如Skia,Cario等二维矢量渲染引擎就具备这样的硬件加速能力。
[0004] 在地理信息系统领域,一些三维场景应用中需要在某个平面上渲染出二维图形,也就是需要同时使用到三维和二维矢量渲染引擎的能力。然而,计算机二维、三维矢量渲染引擎在引擎的输入数据类型、渲染原语定义上存在区别,导致二维、三维一体化矢量渲染难以达到理想的效果,比较突出的问题有:
[0005] 1)目前常用的二维矢量渲染引擎和一些操作系统平台或者硬件平台耦合比较紧密,这导致使用二维矢量渲染引擎的图形软件在不同平台上移植的时候需要更高的成本。
[0006] 2)在同一图形软件中,如果同时使用基于GPU硬件加速的二维矢量渲染引擎渲染二维场景,使用三维矢量渲染引擎渲染三维场景时可能会导致不同或者多个三维矢量渲染引擎因使用GPU硬件出现冲突。
[0007] 3)通常情况下,将二维矢量数据渲染到三维场景中都是先渲染二维矢量数据为位图,然后转换成纹理并渲染到三维场景中,其性能较低并且降低了矢量数据最终显示的效果。
[0008] 为此,针对上述技术问题,本发明提供一种二、三维一体化矢量渲染引擎的装置,所述引擎提供绘制原语转换功能,即将二维绘制原语转换成三维绘制原语,二维绘制原语是功能的输入,三维绘制原语是功能的输出。三维矢量数据直接调用三维矢量渲染引擎完成渲染,二维矢量数据将经过一体化渲染引擎分线、面、图片和文字不同类型处理形成三维绘制原语,然后由三维矢量渲染引擎完成最终渲染,中间并不生成位图,从而达到二、三维一体化快速显示的目的。

发明内容

[0009] 针对现有技术中的不足,本发明实现了一种二维和三维一体化矢量渲染引擎的装置和方法,提供绘制原语转换功能,即将二维绘制原语转换成三维绘制原语,二维绘制原语是功能的输入,三维绘制原语是功能的输出,如图1所示,所述引擎完成二维矢量数据和三维矢量数据的渲染,三维矢量数据直接调用三维矢量渲染引擎完成渲染,二维矢量数据将经过一体化渲染引擎分线、面、图片和文字不同类型处理形成三维绘制原语,然后由三维矢量渲染引擎完成最终渲染,如图2所示。
[0010] 线渲染通过定义颜色、线宽、线型语义来渲染折线、曲线矢量数据。线绘制原语转换根据颜色、线宽、线型转换为三维绘制原语,一个带颜色值的顶点数组和一个索引数组就是线绘制原语到三维绘制原语转换的结果,线原语转换过程需要根据线的类型转换线的端头为平头或者圆头,如果是圆头则需要插入多个顶点形成三角形扇形模拟端头的圆弧,相应的顶点和索引应加入顶点和索引数组形成更为复杂的三维渲染原语;对于多段折线也需要在线段间衔接处生成圆弧衔接的扇形,平角衔接类型的线型需要考虑线段夹角为锐角时会计算出的尖头。
[0011] 面填充渲染通过定义填充类型、填充颜色语义来渲染面矢量数据。面渲染原语转换主要使用三角剖分算法实现,以面的轮廓线为基础将面剖分成若干镶嵌的三角形,所有这些镶嵌的三角形最终覆盖面的范围。面渲染原语转换输出的结果和线渲染原语转换的结果类似,也是一个带颜色值的顶点数组和一个索引数组。面颜色填充包括是纯色填充和渐变色填充,纯色填充时输出的三维渲染原语中顶点颜色值为相同的颜色值,渐变色填充时,在三角形剖分过程中添加若干以填充中心为圆心圆的辅助线,剖分出更为复杂的镶嵌三角形,并根据三角形顶点距离渐变色填充中心点的距离来计算剖分出来的三角形顶点的颜色值。基于路径的渐变色填充采用圆心渐变填充类似的方式,在剖分过程中添加若干的辅助线来加密剖分的三角形,根据到路径起点的距离计算剖分出来的三角形顶点颜色值。
[0012] 位图渲染原语的转换主要是换算出位图显示的矩形范围、以及该范围对应于位图上的纹理坐标。
[0013] 字体渲染原语转换方法和面渲染原语转换相似,对于字体渲染过程来说,使用者输入的数据不是面范围,而是字体、颜色、字体大小、文字,排版布局信息,渲染引擎根据字体和字体大小从字体库中获取字体渲染的轮廓,通过面三角剖分算法形成字体渲染的三维渲染原语。
[0014] 一体化矢量渲染引擎具备二维矢量渲染引擎的核心能力,和具体操作系统平台或者硬件平台没有明确的依赖关系,使用一体化渲染引擎的图形软件可以快速到移植到不同平台,并能够保持不同平台上渲染效果一致,解决了常用二维矢量渲染引擎和平台过于紧耦的问题。
[0015] 一体化渲染引擎不严格依赖特定的三维矢量渲染引擎来做最终的渲染,用户可以在图形软件中根据开发的需要选择使用不同的三维矢量渲染引擎来做最终的渲染,图形软件中同时基于硬件加速渲染二维、三维图形时不会出现硬件争抢的情况,解决了不同三维引擎争抢GPU硬件或者创建多个硬件引擎带来更多的开销的问题。
[0016] 一体化渲染引擎直接将二维矢量数据渲染到三维场景中的某个平面上,并不采用纹理贴图的方式,先绘制数据到位图,再将位图转换成纹理后贴图,过程简单且不会造成失真,提高二维矢量渲染的速度,也可以提升渲染的效果。
[0017] 一种二、三维一体化矢量渲染引擎的原理如下:
[0018] 1)虽然二维、三维矢量渲染引擎在引擎的输入数据类型、渲染原语定义上存在区别,但最终输出都可以保持一致,即以栅格(像素)的形式渲染到位图或者显示设备上。三维矢量渲染引擎在理论上比二维矢量渲染引擎多一个维度,二维矢量渲染引擎的功能只是三维矢量渲染引擎在一个平面上的功能。也就是说,三维矢量渲染引擎理论上可以兼容二维矢量渲染引擎的功能。
[0019] 2)针对常用二维矢量渲染引擎在不同平台上移植难度较大的缺点,本发明提供的二、三维一体化矢量渲染引擎与方法可以减少使用该引擎的图形软件在不同平台上移植的成本,并能够保持不同平台上渲染效果一致。
[0020] 二维矢量渲染用途广泛,但基于CPU计算的渲染速度逐渐不能满足图形软件开发需要。基于GPU硬件加速的二维矢量渲染引擎具有很广的使用前途,但是,现有基于GPU硬件加速的二维矢量渲染引擎都是将三维矢量渲染引擎以紧耦合的方式置于二维矢量渲染引擎内部。例如,Skia和Cario渲染引擎都紧耦了OpenGL三维渲染引擎,Direct2D紧耦了Direct3D,这种紧耦合方式在一定程度上简化了硬件加速带来的开发复杂性,但是让使用这些引擎的图形软件在跨越多个平台开发的时候存在更多的工作,并且不同二维绘制引擎对于二维渲染原语的不同解释也造成图形软件表现效果不一致。
[0021] 本发明提供的二、三维一体化矢量渲染引擎将二维绘制原语作为输入,将通用的三维绘制原语作为输出。虽然在不同平台上具有不同的三维矢量渲染引擎,但是,各种三维矢量渲染引擎的绘制原语则基本一致。因此,该引擎使用者只需要较少甚至无需改动即可将输出的三维渲染原语用于不同平台上的三维渲染引擎,而且,该引擎如果移植到不同的平台上也可以保持一致的渲染效果。
[0022] 3)在同一款图形软件中,如果存在使用三维渲染引擎,也使用带硬件加速能力的二维渲染引擎,把二维图形渲染作为三维场景的局部平面显示,则会导致三维引擎争抢GPU硬件或者创建多个硬件引擎带来更多的开销的问题。本发明提供的二、三维一体化矢量渲染引擎可以让图形软件中同时基于硬件加速渲染二维、三维图形时不会存在硬件争抢的情况。
[0023] 基于硬件加速的二维矢量渲染引擎通常将某三维渲染引擎封装于内部来达到硬件加速的目的。基于硬件加速的二维矢量渲染引擎内部封装的三维渲染引擎上下文句柄可能无法访问或者难以访问到,如果图形软件同时也要渲染三维场景,则三维场景的渲染引擎和二维渲染引擎中的三维引擎很难共享引擎。例如,使用Direct2D渲染二维图形,使用DirectX渲染三维场景,这种情况下,图形软件中实际使用了多个三维引擎实例,对图形软件的运行带来额外的开销。
[0024] 如果二维图形使用基于OpenGL加速的二维矢量渲染引擎,同时使用OpenGL渲染三维场景,这种情况下可以容易地共享三维渲染引擎的实例。但是,如果图形软件将两种引擎分别用于不同的应用,则会造成两种应用同时使用OpenGL时的渲染错乱,因为OpenGL引擎的特点是同一时刻只能存在一个实例进行渲染,这将导致在渲染前需要切换到正确的引擎实例。上述基于硬件加速的二维矢量渲染引擎不容易访问内部三维引擎的实例的问题造成了切换引擎实例时难于把握最佳的时机。
[0025] 本发明提供的二、三维一体化矢量渲染引擎并不是直接将三维渲染引擎通过紧耦合的方式置于引擎内部,因此,该引擎用户可以自由选择使用不同的三维渲染引擎执行渲染,也更容易决定三维场景和二维渲染是否使用同一个三维渲染引擎实例。
[0026] 4)三维场景中渲染二维矢量通常采用纹理贴图的方式,绘制数据到位图,再将位图转换成纹理后贴图,这种方法造成整个过程效率低下,同时纹理贴图也会造成矢量数据显示出来后失真。本发明提供的二、三维一体化矢量渲染引擎直接以矢量的形式在三维场景中绘制二维矢量数据,过程简单且不会造成失真。
[0027] 在三维场景的某个平面中需要渲染二维矢量图形时,通常是通过二维矢量渲染引擎将矢量数据渲染到位图中,然后通过纹理贴图的三维绘制原语将二维矢量位图贴到三维场景中。这种做法存在多个较慢的步骤,这对于性能要求较高的应用,存在比较明显的延迟,从而造成了不佳的用户体验。另外,对于纹理渲染出来的平面倾斜,会造成已经栅格化的矢量位图以拉伸或者收缩的方式显示,从而导致出现马赛克现象。
[0028] 本发明提供的二、三维一体化矢量渲染引擎可以将二维渲染原语转换成三维渲染原语,当用户需要将输出结果用于三维引擎渲染时,可以直接将数据渲染到三维场景的某个平面中,此方式可以直接提高将二维数据渲染到三维场景中的性能,也不会造成马赛克现象。
[0029] 有益效果
[0030] 1、本发明在二维渲染方面不依赖某个特定的三维矢量渲染引擎,使得本引擎相对更加轻量,在不同平台间移植成本更低,可以更加灵活使用。
[0031] 2、本发明不是紧密耦合某个特定的三维渲染引擎,使得图形软件中进行二、三维一体化渲染时可以共用同一个三维渲染引擎的实例。二、三维一体化渲染时二维数据渲染的流程更短,因此可以获得很好的渲染性能和效果。

附图说明

[0032] 图1是本发明二维和三维一体化矢量渲染引擎原理示意图;
[0033] 图2是本发明二维绘制原语到三维绘制原语的转换示意图;
[0034] 图3是线绘制原语转换示意图;
[0035] 图4是线原语转换过程中的圆头处理;
[0036] 图5是多段折线原语转换过程中的尖头处理;
[0037] 图6是虚线原语转换处理;
[0038] 图7是面渲染原语转换示意图;
[0039] 图8是面渐变色填充时渲染原语转换示意图;
[0040] 图9是基于路径的面渐变色填充时渲染原语转换示意图。
[0041] 图10是位图渲染原语转换示意图;
[0042] 图11是字体渲染原语转换示意图。

具体实施方式

[0043] 二维和三维一体化矢量渲染引擎的跨平台实现
[0044] 一体化矢量渲染引擎提供转换二维绘制原语为三维绘制原语的功能,并且具备跨平台应用的能力,在不同的操作系统平台或者硬件平台使用不同的编程语言来实现。
[0045] 对于PC平台和嵌入式设备,采用C、C++编程语言实现。对于iOS设备,适合用object-c语言实现。对于Android设备或者Web Service服务应用,适合用C、C++实现封装JNI调用或者直接使用Java语言实现。对于Web浏览器上应用,适合用JavaScript语言实现,但限于JavaScript语言能力,在浏览器应用中可以只实现本渲染引擎的局部或者实现简化版本。
[0046] 二维绘制原语到三维绘制原语的转换
[0047] 一体化矢量渲染引擎具有二维绘制原语到三维绘制原语的转换功能,如图1所示。该渲染引擎在不同的操作系统平台或者硬件平台上运行的时候需要和该平台上使用的某种三维矢量渲染引擎配合形成一个完整的可用于独立二维渲染或者二、三维一体化渲染的矢量渲染引擎。
[0048] 二维绘制原语转换成三维绘制原语时,二维绘制原语是功能的输入,三维绘制原语是功能的输出,其中,二维渲染原语可以分为四种类型:
[0049] (1)线渲染,通过定义颜色、线宽、线型等语义来渲染折线、曲线矢量数据。
[0050] (2)面填充渲染,通过定义填充类型、填充颜色等语义来渲染面矢量数据。
[0051] (3)位图渲染,将位图数据渲染到特定范围内。
[0052] (4)字体渲染,将文字以特定的字体、大小渲染出来。
[0053] 二维绘制原语到三维绘制原语的转换示意图如图2所示。本引擎可完成二维矢量数据和三维矢量数据的渲染,三维矢量数据无需处理直接调用三维矢量渲染引擎即可完成渲染,二维矢量数据将经过本渲染引擎分线、面、图片、文字四种类型处理形成三维绘制原语,然后由三维矢量渲染引擎完成最终渲染。
[0054] (1)线绘制原语转换
[0055] 根据颜色、线宽、线型转换为三维绘制原语,如图3所示。
[0056] 简单的具有线宽和颜色实线绘制原语转换成三维绘制原语是(P1~P4)四个点构成的两个三角形通过顶点数组[P1,P2,P3,P4],索引数组[0,1,2,0,1,3]描述。如果考虑线的颜色则顶点数组数据中需要为每个顶点添加颜色值,即顶点数组为[(P1,Color),(P2,Color),(P3,Color),(P4,Color)]。一个带颜色值的顶点数组和一个索引数组就是线绘制原语到三维绘制原语转换的结果。
[0057] 线原语转换过程需要根据线的类型转换线的端头为平头或者圆头,如图4所示。如果是圆头,则需要插入多个顶点形成三角形扇形模拟端头的圆弧,相应的顶点和索引应加入顶点和索引数组形成更为复杂的三维渲染原语。
[0058] 对于多段折线,需要在线段间衔接处考虑生成圆弧衔接的扇形,平角衔接类型的线型则需要考虑线段夹角为锐角时会计算出的尖头,如图5所示,在转换过程中,应该避免这样的尖头导致出现不合理的显示效果。
[0059] 对于虚线而言,每个实部都采用实线的方式转换为三维渲染原语,如图6所示。
[0060] (2)面渲染原语转换
[0061] 主要使用三角剖分算法以面的轮廓线为基础将面剖分成若干镶嵌的三角形,所有这些镶嵌的三角形最终覆盖面的范围。面渲染原语转换输出的结果和线渲染原语转换的结果类似,也是一个带颜色值的顶点数组和一个索引数组。
[0062] 面三角剖分时应考虑中间带洞的面数据,如图7所示,应该避免剖分中间的洞,最终形成镶嵌三角形覆盖类似圆环的范围。
[0063] 面渲染的目标是为面中间填充相应的颜色,面颜色的填充可以是纯色填充,对于这样的情况,最终输出的三维渲染原语中顶点颜色值为相同的颜色值。
[0064] 面颜色填充也可以是渐变色填充,渐变色填充具有多种方式如以中心向四边渐变填充,如图8所示,可以在做三角剖分算法时添加若干以填充中心为圆心圆的辅助线,最终可以剖分出更为复杂的镶嵌三角形,剖分出来的三角形顶点的颜色值依赖于三角形顶点到渐变色填充中心点的距离来计算。
[0065] 基于路径的渐变色填充也可以采用圆心渐变填充类似的方式在剖分过程添加若干的辅助线来加密剖分的三角形密度,剖分出来的三角形顶点颜色值可以根据到路径起点的距离进行计算,如图9所示。
[0066] (3)位图渲染原语转换
[0067] 主要能力是换算出位图显示的矩形范围、以及范围对应于位图上的纹理坐标。
[0068] 如图10所示,期望绘制的位图的全部范围为[(0,0)~(1,1)],位图中的期望绘制范围为[(u,v)~(u1,v1)],转换成三维渲染原语是四个点组成的两个三角形,四个点中的每个点都应带有纹理坐标。位图渲染转换成的三维渲染原语顶点坐标数组为[(P1,(u1,v)),(P2,(u,v)),(P3,(u,v1)),(P4,(u1,v1))],索引数组为[0,1,2,0,1,3]。
[0069] (4)字体渲染原语转换
[0070] 转换方法和面渲染原语转换比较类似。
[0071] 对于字体渲染过程来说,使用者输入的数据不是面范围,而是字体、颜色、字体大小、文字,排版布局等信息,渲染引擎根据字体和字体大小从字体库中获取字体渲染的轮廓,通过面三角剖分算法形成自体渲染的三维渲染原语,如图11所示。
[0072] 三维渲染原语中坐标值均为三维坐标值,二维矢量数据没有Z坐标,因此,二维渲染原语转换成三维渲染原语之后,三维渲染原语中的Z坐标均为0。如果使用本引擎在三维场景中渲染二维矢量数据则会让矢量数据都渲染在XOY平面上。如果期望二维数据能够渲染到三维场景中的其他平面中,则可以在调用三维渲染引擎之前设置三维渲染引擎的世界坐标转换矩阵,可以将数据最终渲染到三维场景的任意平面中。
[0073] 最后应说明的是:显然,上述实施例仅仅是为清楚地说明本申请所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引申出的显而易见的变化或变动仍处于本申请型的保护范围之中。