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