IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    AGG入门(八) - 渲染

    Shihira发表于 2012-08-01 12:01:00
    love 0

    一、引言

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

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

    二、工作

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

    #include

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

    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> 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的定义,应该是可以理解的;


    Shihira 2012-08-01 20:01 发表评论


沪ICP备19023445号-2号
友情链接