天天看點

AGG第三十二課 renderer_outline_aa更快的渲染線段算法

       本章提供了采用新的線段渲染算法的例子,相比于已經實作的stroke管道算法,平均提高了2倍的速度,最好的情況下是2.6倍加速度。當然這種算法應用在細線上速度才會快,最好是小于2個像素。

在其他的章節中會跟conv_stroke進行效率的對比。同樣的避免不了引入更多的限制,這一點可以在下面了解到。多說一句:conv_stroke是最昂貴的轉換器。

#include"agg/include/agg_rasterizer_outline_aa.h"

#include"agg/include/agg_renderer_outline_aa.h"

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)當然都說是渲染線段的算法,自然就不會渲染點了。

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

    profile.width(5);//強制性要求設定線寬

    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

     本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1963384,如需轉載請自行聯系原作者

繼續閱讀