vertex source顶点源直接传递给scanline rasterizer效果

AGG内置了大量的顶点源,我们可以直接调用,他们包括:

agg::path_storage

agg::arc

agg::rounded_rect

agg::ellipse

agg::curve3

agg::curve4 ......

1)针对agg::path_storage


现在尝试查看agg::path_storage直接传递给scanline rasterizer之后的效果:

//现在我们尝试描绘一条线段,这里有一个问题不通过agg::conv_stroke,怎么

//设置线段的宽度,默认值也没有

//什么也没有,根本无法画线,看来还是需要传递给agg::conv_stroke??

agg::path_storage ps1;

ps1.move_to(130,130);

ps1.line_to(140,140);

ras.add_path(ps1);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();


//难道不能够直接描绘,还是我们描绘的方式不正确!!

//如果再次添加一条线段,现在可以构成一个闭区间,又会如何:

agg::path_storage ps1;

ps1.move_to(130,130);

ps1.line_to(140,140);

ps1.line_to(150,130);

ras.add_path(ps1);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

//出来了,终于出来了,这是一个实心的三角形,填充颜色为红色。

简单的结论:当我们不经过agg::conv_stroke的时候,实际上这些顶点源可能没有方向,不可能啊!!line_to是干啥的!!

2)针对agg::ellipse


可对比如下的两份代码:

1)

agg::ellipse ellipse(250, 125, 125, 125);

ras.reset();

ras.add_path(ellipse);

//实心圆

2)

agg::ellipse ellipse(250, 125, 125, 125);

agg::conv_stroke<agg::ellipse> stroke(ellipse);

ras.reset();

ras.add_path(stroke);

//空心圆


所以我们终于知道,当我们将顶点源传递给stroke是画线,如果直接add_path实际上

是渲染一个形状,现在假设当agg::ellipse传递给agg::conv_stroke的时候,实际上

将圆的顶点全部传递给了线段容器,线段容器,这个时候线段容器当然是把圆的弧线

进行了端点的相连,但是不会填充颜色,因为看成是线段

但是直接传递给ras的时候,是一系列的顶点,而Scanline Rasterizer能够把顶点数据转换成

一组水平扫描线,扫描线由一组线段(Span)组成,这个时候,实际上就是圆同一水平线的

两点之间进行了扫描连接.


总结:顶点源如果能够形成一个闭区间,完全能够传递给ras,描绘一个实体,如果不能,

将不会渲染任何的东西,当通过agg::conv_stroke传递给ras,描绘的是线段。

 /*

 两种不同的方案,一种是当做是标志,而不是一个填充的实体,上面是一个空心


 三角形,而下面是一个填充的三角形。在这里可以详细的描述一点:任何的多边


形都可以

 使用三角形来拆分,所以

 */

 //agg::conv_stroke<agg::path_storage> stroke(ps);

 //ras.add_path(stroke);

 agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));


由于画太极图的需要,我需要进行圆形的填充,GDI提供了Pie函数,而AGG并没有提供任何的函数

因此提出的一种方案:

填充颜色,对圆进行填充颜色,真的非常麻烦,没有提供什么接口,也找不到任何

的资料,我打算提供每一行的圆的两点,然后画直线的方式填充。经过上面的讨论

终于找到解决的方案。





你可能感兴趣的:(source,vertex)