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

OpenVG简介_第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简介_第2张图片
一旦考量到这些资讯,程式设计师就必须决定要在应用中采用何种字型。通常视不同的绘图需求,可以混用两种字型。举例来说,可缩放的文字就要用向量字型,而大小固定不变的字型,例如按键标示,就可以改用点阵字型。  

OpenVG加速动画效果制作 

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

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

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

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

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

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

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


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

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


你可能感兴趣的:(GPU)