1:OpenVG介绍
矢量图形具有许多优势,比如无失真,方便生成。然而确很难融合到一般的程序中使用。下边将介绍OpenVG及如何导入,表示和利用现有的矢量图形。
2:OpenVG的PipeLine:
如果了解OpenGL的话,都知道OpenGL有一个处理管道,我们将所有的数据--顶点,法线,色彩等送到管道的一端进行处理,然后对管道设置旋转,光照,截取等的参数,最后我们就可以得到光栅化,可以显示的图像了。
OpenVG同样有一个处理管道,他的所有数据是指一个矢量图形的所有点形成的路径,使用的笔触(毛笔的,直线的或虚线的),使用的颜色等绘制参数之类(纯色填充,渐变填充)。 第1步:将以上数据准备好。第二步:如果是带笔触的路径,将生成一个新路径,用于以后的处理,将旧路径设置为不可用。第三步:平移,旋转等变换。第四步:光栅化,将有一个过滤处理,去除一些东西(比如根据屏幕的大小等来调整那些点为可见)。第五步: 剪切和蒙版,将根据设置剪掉一些区域,使用蒙版调整Alpha值等。第六步:根据以上生成的数据,和绘制参数,进行绘制,如颜色填充,渐变等。第七步:图像插值。第八步:blending和反走样。
那么对于我们使用矢量图形而言,最重要的就是path和path的填充参数了。
3:程序中生成一个path。
vgSetParameteri
vgSetParameterfv
vgAppendPathData
附图为demo程序截图。
首先move到一个点,然后lineto画了四条线. 根据参数的不同,可以画出复杂的矢量图形。
PS* ps = (PS*)malloc(sizeof(PS));
int paths = 5;
int startp = 0;
int i = 0;
int elements = sizeof(unsigned char);
unsigned char* cmd = (unsigned char*)malloc(elements);
float color[4];
const float point[] =
{
100,100,480,100,480,480,100,480,100,200
};
ps->m_numPaths = paths;
ps->m_paths = (PathData*)malloc(paths * sizeof(PathData));
for(i=0;i<paths;i++)
{
ps->m_paths[i].m_capStyle = VG_CAP_ROUND;
ps->m_paths[i].m_joinStyle = VG_JOIN_ROUND;
ps->m_paths[i].m_fillRule = VG_EVEN_ODD;
ps->m_paths[i].m_paintMode = VG_FILL_PATH|VG_STROKE_PATH;
//the rest of stroke attributes
ps->m_paths[i].m_miterLimit = 20;
ps->m_paths[i].m_strokeWidth = 20;
color[0] = 0.4f;
color[1] = 0.6f;
color[2] = 0.8f;
color[3] = 1.0f;
ps->m_paths[i].m_strokePaint = vgCreatePaint();
vgSetParameteri(ps->m_paths[i].m_strokePaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
vgSetParameterfv(ps->m_paths[i].m_strokePaint, VG_PAINT_COLOR, 4, color);
if( i == 0)
cmd[0] = VG_MOVE_TO | VG_ABSOLUTE;
else
cmd[0] = VG_LINE_TO | VG_ABSOLUTE;
ps->m_paths[i].m_fillPaint = vgCreatePaint();
vgSetParameteri(ps->m_paths[i].m_fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
vgSetParameterfv(ps->m_paths[i].m_fillPaint, VG_PAINT_COLOR, 4, color);
ps->m_paths[i].m_path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, (unsigned int)VG_PATH_CAPABILITY_ALL);
vgAppendPathData(ps->m_paths[i].m_path, elements, cmd, point + startp);
startp +=2;
}
4: openGL的实现方式:
1: 内部表示,矢量图形系统的内部表示无外乎是点和点,以及点之间的连接规则。OpenVG也是如此,内置VG_MOVE_TO ,VG_LINE_TO,VG_CUBIC_TO等15种连接方式。
2:光栅化,算法如下:对所有的扫描线y1,y2,y3.....计算,如y1:在y1周围0.5个象素内,计算所有边和y1的交点,因为是0.5象素的距离,所以一个边会有两个交点,minx,maxx.对所有边的minx排序,根据定义的方式是相邻的两个minx,maxx有coverage还是最小和最大的minx和maxx之间有coverage,然后根据panit画点。
OpenVG的光栅化实现了对一行扫描线的即时扫描,相当底层,可以兼容很多老式或低级设备。所以速度也很慢,需要显示卡或其他的加速才可以更好的支持某些设备。
5:优缺点:
OpenVG定义的方式已经非常接近常用的矢量绘图软件了。
OpenVG其实是定义了一种硬件的实现,利用光栅化的操作,软件实现是很慢的,硬件实现会快的多。
6:展望:
OpenVG是为了在手持等跨平台设备中寻求统一,矢量绘图的功能方面其实较弱。
SVG作为一个显示标准,是方便在网页或其他软件中寻求统一,并易于编辑,丰富视觉感受,无法任意改动应用在程序处理中。
以下是一个复杂得矢量图形,在没有优化处理得情况下,耗时50秒才处理显示出来。