AGG第三十二课 renderer_outline_aa更快的渲染线段算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘t need 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<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更快的渲染线段算法的主要内容,如果未能解决你的问题,请参考以下文章
AGG第四十二课 Blitting an image over another with transparency