posts - 36, comments - 30, trackbacks - 0, articles - 0

openVG使用实例

Posted on 2007-06-20 12:01 vcommon 阅读(9253) 评论(4)  编辑 收藏 引用

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秒才处理显示出来。

Feedback

# re: openVG使用实例[未登录]  回复  更多评论   

2008-02-01 16:48 by tommy
LZ使用的是官方的OpenVG库,那个效率很低,几乎没有什么实际用途;
推荐您一个OpenVG库,未优化版本渲染那只老虎仅需要0.1s(P-m 1.5,官方程序对照渲染需要80s)
web:www.hygraphics.com
库是免费的,还有很多例子

# re: openVG使用实例[未登录]  回复  更多评论   

2009-04-24 16:03 by Vincent
其实现在的OpenVG Spec还不很成熟,包括1.1的。它的管线定义离实际的Hardware Implementation还有相当的距离,这也是为何目前不少图形厂商都未有提交OpenVG。

# re: openVG使用实例  回复  更多评论   

2009-08-06 13:19 by eric_chen
高质量的2D矢量图形库,使用起来简单,功能强大,效率高。
window: http://picasso-graphic.googlecode.com/files/picasso_0.9_beta1.zip

linux : http://picasso-graphic.googlecode.com/files/picasso_0.9_beta1.tar.gz

email: onecoolx@gmail.com

# re: openVG使用实例  回复  更多评论   

2009-08-26 10:21 by eric_chen
picasso 矢量图形库更新
http://code.google.com/p/picasso-graphic/
只有注册用户登录后才能发表评论。