AGG第三十二课 renderer_outline_aa更快的渲染线段算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AGG第三十二课 renderer_outline_aa更快的渲染线段算法相关的知识,希望对你有一定的参考价值。

留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子!

前言  

       本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度。当然这种算法应用在细线上速度才会快,最好是小于2个像素。

在其他的章节中会跟conv_stroke进行效率的对比。同样的避免不了引入更多的限制,这一点可以在下面了解到。多说一句:conv_stroke是最昂贵的转换器。

The rasterizer itself works much faster, besides, in this case you won‘t
need to use the most expensive converter, that is, conv_stroke.


头文件

#include"agg/include/agg_rasterizer_outline_aa.h"

#include"agg/include/agg_renderer_outline_aa.h"

3限制

1)最大的线宽已经被硬编码了,最大值是128个像素,在agg::line_interpolator_aa_base类中

定义,声明的变量是max_half_width.

2)线段的链接方式只能是miter.如果渲染的线比较厚,并且线与线之间的夹角非常尖锐,线段之间的连接方式可能就没有conv_stroke生成的准确。虽说在渲染厚线的时候不是要求太苛刻

3)线段端点的行传只能够是butt_cap或者round_cap.除此之外,butt_cap不是抗锯齿的。round_cap看起来好些,但是影响性能,尤其是你渲染虚线的时候(虚线占6像素,间距是3像素,大概慢1.5倍)

如果渲染长线,那就不需要那么苛刻。调用agg::rasterizer_outline_aa::round_cap(true/false)设置。

4)在渲染一些小的图形轮廓线,效果不是很好。但是在渲染地图,字符,图像,oscilloscopes等表现的也已经很完美了。

5)当然都说是渲染线段的算法,自然就不会渲染点了。

4代码实例

1)简单实例

  agg::rendering_buffer&rbuf = rbuf_window();

   agg::pixfmt_bgr24 pixf(rbuf);

 

   typedef agg::renderer_outline_aa<agg::pixfmt_bgr24> renderer_type;

   agg::line_profile_aa profile;

   profile.width(5);//设置线宽

   renderer_type ren(pixf,profile);

 

   typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

   rasterizer_type ras(ren);

 

   ren.color(agg::rgba8(255,0,0));//设置线段的颜色

   ras.move_to_d(100,100);

   ras.line_to_d(500,500);

   ras.render(false);

2)可供选择

    agg::rendering_buffer &rbuf = rbuf_window();

    agg::pixfmt_bgr24 pixf(rbuf);


    typedef agg::renderer_outline_aa<agg::pixfmt_bgr24> renderer_type;

    agg::line_profile_aa profile;

    profile.gamma(agg::gamma_power(1.2));//可选

    profile.min_width(0.75);//可选

    profile.smoother_width(0);//可选

    profile.width(5);//强制性,要求设置线宽

    renderer_type ren(pixf,profile);


    typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

    rasterizer_type ras(ren);

    ras.round_cap(false);//设置线段端点行传可选

  

    ren.color(agg::rgba8(255,0,0));//设置颜色,可选

    ras.move_to_d(100,100);

    ras.line_to_d(500,500);

    ras.line_to_d(300,400);

    ras.render(false);//强制性,是否围成闭合的曲线,false绘制折线

3)调用add_path添加顶点源,可以不调用ras.render

    agg::rendering_buffer &rbuf = rbuf_window();

    agg::pixfmt_bgr24 pixf(rbuf);


    typedef agg::renderer_outline_aa<agg::pixfmt_bgr24> renderer_type;

    agg::line_profile_aa profile;

    profile.gamma(agg::gamma_power(1.2));//可选

    profile.min_width(0.75);//可选

    profile.smoother_width(0);//可选

    profile.width(5);//强制性要求设置线宽

    renderer_type ren(pixf,profile);


    typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;

    rasterizer_type ras(ren);

    ras.round_cap(false);////可选

  

    ren.color(agg::rgba8(255,0,0));//可选

    agg::path_storage ps;

    ps.move_to(600,600);

    ps.line_to(600,100);

    ras.add_path(ps);


邮件的详细信息:

http://sourceforge.net/p/vector-agg/mailman/vector-agg-general/?viewmonth=200309&page=1


以上是关于AGG第三十二课 renderer_outline_aa更快的渲染线段算法的主要内容,如果未能解决你的问题,请参考以下文章

python第三十二课——栈

第三十二课 linux内核链表剖析

第三十二课Qt中的文件操作

AGG第四十二课 Blitting an image over another with transparency

AGG第二十二课 conv_contour函数auto_detect_orientation的字体应用

AGG第三十五课 gsv_text 渲染ASCII字符