首页 > 代码库 > OpenVG简介

OpenVG简介

原文链接:http://www.tuicool.com/articles/rAFR7b

参考文献1:http://www.doc88.com/p-008309425812.html

参考文献2:http://wenku.baidu.com/link?url=fKmRtafeRtB685fOCld3S85K3CKaDfwoGUL7dMxb3FGKHMLiHdU4WCu2EpasZ_W7iWcvX6EJkC80XJyx-59K4uqwRcKr6jWHM2y-rMgePk_

参考文献3;http://baike.baidu.com/link?url=YtsghvKgqaSseT47XlKJ3q9O5tnZawuJGVtiDYR0IdNj_ba9bKJcii7R-_XuD10E_YZA_-_G2ThqMdClfbkF8_

参考文献4:https://www.khronos.org/openvg/


嵌入式系统显示效能可望大幅提升。OpenVG应用程式介面(API),由于系以硬体方式处理向量及点阵图形,可加快绘图运算速度,并让2D动画影像更加流畅,呈现更吸睛的视觉效果,因而已逐渐受到嵌入式系统开发商青睐。

OpenVG是一种应用程式介面(API),系由Khronos Group所研制,用来显示向量化格式及点阵影像,并以硬体加速方式操作。
OpenVG处理两种主要的上层物件。首先是点阵图,这是一种记忆体架构,用来储存/绘制影像。每个x和y座标都对应到一个画素;而每个画素都拥有一个Alpha、红、绿与蓝(ARGB)数值,因此一个解析度200×200的影像就需要200×200(色阶深度)个位元组来储存。点阵图对于照片画质的绘图尤其有用。在后面运用范例(Use Case)里所介绍的Coverflow应用,就有影像处理程式码及功能可供参阅。  

另一种则是向量格式。向量是一种以起点和终点来描述的数学算式,根据各点互连方式,可能还须要加上其他如曲线控制点、弧线半径、弧度之类的参数。这种特性让向量非常适于延展,因为它并不须要靠每一个画素的资料来呈现影像。  

图1所描绘的是两个原本在一般大小时看似无异的圆圈,随着画面放大,点阵图逐渐失真,但向量影像却仍能保持滑顺而清晰的轮廓。  

技术分享
图1 向量与点阵图比较
向量并不一定在所有场合都胜过点阵图。点阵图在固定大小时比较清晰,但是在放大后就会变得失真。点阵图处理起来较快,但是较耗费记忆体。向量则可以在任何缩放尺寸下保有影像画质,耗费记忆体也较少。向量影像只能以向量设计工具绘制,点阵图则可以来自相片、任何影像源,或制图工具。  

OpenVG绘图效能更出色 

理想的OpenVG管线(Pipeline)包括一套八段式的程序。虽然不是所有的实作手段都确实按照这套理想的管线,然而实作的成果却都应根据Khronos所定义测试程序,以确保一定的容错程度。其程序分别为:路径定义与API参数的设定;笔划;转换;画素转换;修剪与遮蔽;着色;影像内插;色彩转换;混合及防止失真。  

以全球卫星导航(GPS)地图来说,要呈现可任意缩放的地图,标准方式就是透过向量。线上有很多种免费的地图软体工具,大多数都允许使用者将地图汇出为SVG档案,这个档案须再解译,并转换为OpenVG一般的架构,才能继续使用。  

此外,以OpenVG加速过的使用介面,可以产生出流畅、易于延伸的人机介面(HMI),并提供一套完整的动态字型绘制引擎,具备各种混合及绘制功能。  

OpenGL可以完成多项绘图作业,例如字型、2D GUI及HMI等等;而其最大的优点为处理多边形及纹路。OpenGL是点阵图导向,因此即使是以强大的OpenGL核心做简易的绘图,也须耗费宝贵的时间。  

OpenVG补足了绘图的需求。它本身就是绝佳的应用,如果配合OpenGL,就能同时管理字型、向量及大部分的2D和虚拟3D组件,让OpenGL核心把时间用在它最擅长的项目上。  

即使单独使用OpenVG时,也仅需少量电流及耗用记忆体,便可完成多项作业。若配合OpenGL使用,OpenVG便可转而管理OpenGL核心并不擅长的作业。  

点阵影像绘制范例 

以OpenVG处理影像相当简易,按照以下步骤即可在所需的表面上绘制影像:  

.1.宣告一个VGImage物件。 

.2.产生一个VGImage,并为VGImage物件指定处理程式。 

.3.以点阵图资料填满影像。 

.4.为VG_MATRIX_IMAGE_USER_TO_SURFACE设定矩阵模式,以便转换影像(3×3仿射转换)。 

.5.绘制影像。 

对虚拟程式码亦采取相同步骤:  

.1.VGImage ovgarticle_image 

.2.ovgarticle_image=vgCreateImage (VGImageFormat format, VGint width, VGint height, VGbitfield allowedQuality) 

.3.vgImageSubData(VGImage image, const void data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height) 

.4.vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); 

.5.vgDrawImage(ovgarticle_image) 

要进行这种操作,必须了解若干点阵图特性,例如Stride、位元深度及设置混色之类的API属性。  

[@B]向量路径加速图形绘制[@C] 向量路径加速图形绘制 

路径构成了向量加速绘图的核心(图2)。要完全掌握这个概念,必须了解以下观点:  

技术分享
图2 向量路径示意图
.1.路径:是一连串以段落串连起来的点。 

.2.点:座标值。 

.3.段落:两点之间的运算型态,有时需要很多个点才能形成段落的控制值。 

在此用一个简单的三角路径来说明。首先,须定义构成整个路径的段落。构成路径的段落则须以一连串的指令来描述,并以位元组阵列的方式储存。每个指令都会消耗一个或多个点。  

复杂的路径甚至须要动用到弧线和Bezier曲线的概念,在OpenVG里产生并绘制一个路径的步骤包括:  

.1.宣告一个VGPath物件。 

.2.宣告一个区段和点阵列。 

.3.产生一个空的路径,以便接收段落资料(vgCreatePath)。 

.4.将图像段落及点的资料填入路径(vgAppendPathData)。 

.5.绘出路径(vgDrawPath)。 

Cover Flow动画范例说明 

最常见但也最为人所注目的动画,就是2D视角转换,经常用来呈现音响播放装置的唱片封面。这种动画会让人觉得影像在3D空间中沿着x、y及z轴移动或旋转。  

这种转换并非真正透过3D绘图处理器(GPU)或3D处理引擎来实现动画效果,而是先在2D空间中定义,再由OpenVG提供必要的API来达到动画效果。  

在数学观念里,这种效果称为「3D投射」,事实上是将一连串的3D点集合对应到一个2D平面上。观念本身很简单。试想一下,有一个平坦、方形的物体,譬如一片纸或是一张图,你可以将这张图放在面前,让它看起来是矩形。如果你把纸张挪近些,纸张看起来就会变大,如果移远些,又会变小。接着尝试顺着垂直轴转动一下,结果当然看起来就不再是矩形。它会出现一些锐角,因此外观上会像是菱形,甚至会是一直线。这就是3D物体将自身的每个点投影在你眼中的结果。  

在绘图技术里,空间影像处理终究不脱阵列型态的演算。要展开阵列,你必须以阵列与影像相乘。如果要简化影像转换,也要仰赖阵列乘法。要产生一个Cover Flow动画,也必须要用到阵列。在OpenVG里,所有的空间处理都要以阵列变换为之。  

设计关键就在于如何得出所需的「透视阵列(Perspective Matrix)」,以便得到3D的效果。这须要用到一些数学演算。在OpenVG API里也有提供其他设备,可计算出产生透视转换所需的阵列。  

这些OpenVG API的工具函数可协助你计算出透视转换的阵列,不论是四边形转换为四边形,还是把矩形影像转换为给定的四边形,甚至反向而行。如此一来你就可以将影像中任意一点移动到任何想要的位置。在执行Cover Flow动画时,只须透过这些函数,就可以简化演算。  

此外,OpenVG里一共有两种字型:点阵和向量(表1)。这两种字型OpenVG API都有办法处理,也有函数可以定义和登录字型(vgCreateFont)。一旦完成,就可以透过vgDrawGlyphs函数轻松使用字型。  

技术分享
一旦考量到这些资讯,程式设计师就必须决定要在应用中采用何种字型。通常视不同的绘图需求,可以混用两种字型。举例来说,可缩放的文字就要用向量字型,而大小固定不变的字型,例如按键标示,就可以改用点阵字型。  

OpenVG加速动画效果制作 

OpenVG的主要优势,就是可以用既有API轻松做出动画效果。一旦你有了可以绘制的EGL表面,只需要几行指令就可以让影像带到幕前,再加几行就可以令它动起来。  

以汽车应用为例,最常见的需求之一就是要做出生动逼真的指针或仪表。直觉化的OpenVG运算可以用最高的画面刷新速率(如60fps)做到这一点。  

此外,也可以透过常见的转换来达成延展之类的转换效果。延展不仅可以放大或缩小整体外型,也可以沿着个别的x轴和y轴进行。再以指针动画为例,通常指针并不会越过仪表板的蓝色边框,只会淡入或淡出。  

反射则是另一种惊人的效果,同样可以用OpenVG轻松做到。只要对水平影像做一点通透的光滑表面效果,就可以达到反射的效果。既定函数可以反转出一个原本不存在的影像。  

目前已有厂商研制出完全采用向量导向的车用仪表板。在图3两个展示版本当中,车速表是以大字型展示速度资讯,亦即在将现有字型画在表面之前,还要先做放大处理。OpenGL都不见得有这种功力。  

技术分享
图3 以OpenVG开发之向量车用仪表板示意图
此外,业者还研制了简易的动画引擎,以便处理延展、旋转及转换。透过这种绘图引擎,仪表板上的每种路径及点阵影像都可以轻易动画化。 至于像是GPS逐步转向导航之类的复杂动画,也可以透过vgInterpolatePath函数轻易完成。  

此种函数可以接收起始及结束路径(具备类似段落)、终点路径及你想要加入的内插量。终点路径资料会根据选定的数量,以内插方式植入至起点和终点之间。如此一来,仅须定义两个路径状态,便可产生出复杂的路径转换。  


矢量图,[1] 也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件[2] 中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。
矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等。
矢量图使用直线曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。

矢量图也称为面向对象的图像或绘图图像,繁体版本上称之为向量图,是计算机图形学中用点、直线或者多边形等基于数学方程的几何图元表示图像。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
既然每个对象都是一个自成一体的实体,就可以在维持它原有清晰度和弯曲度的同时。这意味着它们可以按最高分辨率显示到输出设备上。
矢量图以几何图形居多,图形可以无限放大,不变色、不模糊。常用于图案、标志、VI、文字等设计。常用软件有:CorelDraw[3-4]   、Illustrator[5-6]   、Freehand、XARA、CAD[7] 等。
1.文件小,图像中保存的是线条和图块的信息,所以矢量图形文件与分辨率和图像大小无关,只与图像的复杂程度有关,图像文件所占的存储空间较小。
2.图像可以无级缩放,对图形进行缩放,旋转或变形操作时,图形不会产生锯齿效果。
3.可采取高分辨率印刷,矢量图形文件可以在任何输出设备打印机上以打印或印刷的最高分辨率进行打印输出。
4.最大的缺点是难以表现色彩层次丰富的逼真图像效果。
5.矢量图与位图的效果是天壤之别,矢量图无限放大不模糊,大部分位图都是由矢量导出来的,也可以说矢量图就是位图[8] 的源码,源码是可以编辑的。


OpenVG简介