欢迎光临散文网 会员登陆 & 注册

renderer_outline_aa更快的渲染线段算法

2021-09-06 13:26 作者:Vecloud_  | 我要投稿



留给:曾经在校园奔跑时候,摔破膝盖,擦伤手掌的孩子!1前言本章提供了采用新的线段渲染算法的例子,相比于已经实现的stroke管道算法,平均提高了2倍的速度,最好的情况下是2.6倍加速度。当然这种算法应用在细线上速度才会快,最好是小于2个像素。 
在其他的章节中会跟conv_stroke进行效率的对比。同样的避免不了引入更多的限制,这一点可以在下面了解到。多说一句:conv_stroke是最昂贵的转换器。 
Therasterizeritselfworksmuchfaster,besides,inthiscaseyouwon'tneedtousethemostexpensiveconverter,thatis,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); 

邮件的详细信息: 
p%3E%3Cp%3E%3Cbr />

了解更多网络知识关注:http://www.vecloud.com/

renderer_outline_aa更快的渲染线段算法的评论 (共 条)

分享到微博请遵守国家法律