AGG入门(八) - 渲染

一、引言

让我们来看一看渲染具体的流程图吧:

上面提到了几个概念,再解释一下:
  • 顶点源(Vertex Source):用顶点的方式描述矢量图形;
  • 光栅化(Resterizer):它的作用是把顶点源所描绘的图形与像素对应起来,可以说类似于Photoshop上的矢量蒙版;
  • 扫描线(Scanline):扫描线的作用就是为扫描线渲染器提供一个扫描的方式和区域,使渲染器有序地填充;
  • 扫描线渲染器(Scanline Renderer):分实色和自定义渲染器两类,实色只允许你用单一的颜色去进行渲染,而自定则可做得多姿多彩,比如渐变、位图;它相当于GDI里的画刷。

二、工作

这次我们以一个自制的顶点源与椭圆组合作为渲染对象,用宝蓝色的实色渲染器进行渲染;

#include <agg_ellipse.h>

//................

class triangle_path {
public:
    triangle_path()
    {
        unsigned tmp_array[4][3]={
            {0  , 250, agg::path_cmd_move_to},
            {500, 250, agg::path_cmd_line_to},
            {250, 500, agg::path_cmd_line_to},
            {0  ,   0, agg::path_cmd_stop}
        };
        memcpy(m_points[0], tmp_array[0], sizeof(m_points));
    }
    unsigned vertex(double *x, double* y)
    {
        *x = m_points[m_step][0];
        *y = m_points[m_step][1];
        unsigned r = m_points[m_step][2];
        m_step++;
        return r;
    }
    void rewind(int)
    {
        m_step = 0;
    }
private:
    int m_step;
    unsigned m_points[4][3];
};

//...... in class the_application

    void on_draw()
   {
        ren_bas.reset_clipping(true);
        ren_bas.clear(agg::rgba8(255, 255, 255));
 
        agg::ellipse ellipse(250, 125, 125, 125);
        triangle_path triangle;
        rasterizer.reset();
        rasterizer.add_path(triangle);
        rasterizer.add_path(ellipse);
        agg::render_scanlines_aa_solid(rasterizer, scanline, ren_bas,
            agg::rgba8(45, 108, 155));  //注意:函数名中的scanline是复数!!
    }

三、解释

先看on_draw函数:我们先定义了两个顶点源,一个是椭圆,另一个是自制的三角形;先把rasterizer重置,清除上次重绘留下的光栅信息;我们再在光栅中添加这两个顶点源,用渲染器渲染,就是了;
你可能感到奇怪:为什么没有扫描线渲染器的定义呢?其实在render_scanlines_aa_solid里,就已经帮你定义好了实色渲染器。把render_scanlines_aa_solid展开成:
agg::renderer_scanline_aa_solid<agg::renderer_base<agg::pixfmt_rgb24>> renderer_scanline(ren_bas);
renderer_scanline.color(agg::rgba8(45, 108, 155, cover));
agg::render_scanlines(rasterizer, scanlines, renderer_scanline);
效率是一样的,只不过函数版本更加简洁。
顶点源的定义,结合上一节的知识和agg_basics.h中关于path_commands_e和path_flags_e的定义,应该是可以理解的;

posted on 2012-08-01 20:01 Shihira 阅读(2806) 评论(0)  编辑 收藏 引用 所属分类: 图形编程


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

留言簿(2)

随笔分类

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜