AGG渲染抗锯齿图像的边界,似乎永远是模糊边界,经研究,是由于使用亚像素精度反走样,边界会有半个像素的模糊。导致多个图像重叠的边界出现颜色一样的问题。正如,作者所言,不要以为采用AGG,就能够解决一切的问题,正所谓道高一丈,魔高一尺。任何的设计都是折中的方案,对于问题,只能够采取规避的方式解决。后续将会持续关注AGG的局限性。
void TestBlackBorden()
{
agg::rendering_buffer &rbuf = rbuf_window();
agg::pixfmt_bgr24 pixf(rbuf);
typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
renderer_base_type renb(pixf);
typedef agg::renderer_scanline_aa_solid<renderer_base_type>renderder_scanline_type;
renderder_scanline_type rensl(renb);
agg::rasterizer_scanline_aa<> ras;
agg::scanline_u8 sl;
ras.reset();
ras.add_path(agg::ellipse(100,150,100,100));
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
ras.add_path(agg::ellipse(200,100,100,100));
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,255,0));
ras.add_path(agg::ellipse(200,200,100,100));
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,255));
}
三个实心圆形成三个环,并且每个圆有重叠的部分,可以看到重叠的边界出现了黑色的弧线。
按照正常的逻辑,边界不是红色,就是蓝色,或者绿色。实际上出现了混合的颜色,抗锯齿的效果采用混合颜色的方式,将底层的颜色和覆盖的颜色进行了混合(alpha-blending),实际上就会显示混合后的颜色。
如下是作者的描述:
I only flipped your p_w_picpath horizontally. Itshows how the colortriplets are
placed and explains this effect. But youare right, these"black borders"
will be seen on any device. To get rid ofthem you need to use gamma
correction. Seeexamples/gamma_correction.cpp.
按照作者的思路进行了gamma的设置,当然不排除设置的错误,没有理解gamma_correction这个例子。
开发者回应:
For my display a gamma of 2.5 looks good. Ithink I will add someuser
defined gamma option to my application. Bytime i will have to delve
into this topic more deeply.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。