千家信息网

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

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子!1 前言本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度。当然这种算法
千家信息网最后更新 2024年09月22日AGG第三十二课 renderer_outline_aa更快的渲染线段算法

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

1 前言

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

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

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


2 头文件

#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 renderer_type;

agg::line_profile_aa profile;

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

renderer_type ren(pixf,profile);

typedef agg::rasterizer_outline_aa 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 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 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 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 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


0