
现在来看看正常大小的同一幅图。能够很容易的分辨出这是“stereo”。然而这是两幅相同的图。只是第一幅比第二幅大。反锯齿并没有让它看起来更清楚,它只是让你的大脑更容易推断出是什么。
AGG中不仅仅使用了反锯齿,它还利用了亚像素精度的技术。下图中显示了使用简单的Bresenham差值放大后的结果。

这三个螺旋形可以近似的看成是由短的直线段组成的。左边的那幅图采用的是正常的Integer Bresenham方法(使用Windows GDI的LineTo和MoveTo函数也可以得到类似的效果)。中间的图采用了改进后的精度为1/256像素的Integer Bresenham方法。而右边的图同样使用了1/256像素的精度,但是同时还使用了反锯齿。请注意,将线段中亚像素真实定位的能力非常重要。如果我们对正常像素坐标使用反锯齿,那么螺旋形看起来会更平滑,但仍然同左边的图一样难看。
亚像素精度甚至比控制线的视觉厚度(visual thickness)更加重要。只有当我们有一个好的反锯齿算法时,良好的精确性才能成为可能。另一方面,如果我们可以只用一个点的离散性来确定线的宽度,那么反锯齿就没有什么用处了。反锯齿和亚像素精确度总是协同使用的。
现代显示器的分辨率最多是120DPI,而利用亚像素精度可以达到300DPI。下面的图片显示的线的宽度从0.3像素开始,依次递增0.3像素。
请注意:那些小的狮子虽然丢失了一些细节,但还是保持了与较大狮子的一致性。
二、 基本观念1. 库的设计
AGG被设计成一系列松散的算法和类模板。因此所有的部分都能够很容易的组合起来。基于模板的设计使得可以替代库的一部分而不需要修改一行代码。AGG也被设计的易扩展和灵活。可以在其中很容易的添加新的算法。
AGG并没有指定任何它的形式,可以自由的使用它的任何一部分。然而,AGG被当作一个在内存中渲染图象的工具。这是学习AGG的一个不错的着手点,可这样并不十分准确。在AGG提供的教程中有如何开始学习AGG更好的例子。
下面是一个典型的AGG渲染途径。
注意在Vertex Source和Screen Output之间的任一步骤都不是强制性的。例如,你能使用基于Windows API光栅化器,这样你就不需要AGG的光栅化和渲染了。如果只想绘制线,可以使用AGG的outline 光栅化器,这样可以更快。
对上图的一些说明:
Vertex SourceVertex Source是一些对象。如多边形,polyline等一系列连续的2D顶点。可以通过MoveTo,LineTo产生。
Coordinate conversion pipeline
Coordinate conversion pipeline由一组坐标转换器组成。它通常作用于用浮点数描绘的矢量数据(X,Y)。可能会包括一些几何变换,轮廓生成等。
Scanline RasterizerScanline Rasterizer把矢量数据转换成许多水平的扫描线。这些扫描线通常(不是必须)带有反锯齿的信息。
RenderersRenderers对扫描线进行渲染。把渲染的结果写入rendering buffer。
Rendering BufferRendering Buffer是内存中的一个在后面用于显示的缓冲区。通常(不是必须)它包含了适应于显示系统的像素格式。如,24位的B-G-R,32位的B-G-R-A或15位的R-G-B-555等。
2. 颜色,颜色空间和像素格式
在AGG中颜色直到要把数据放入rendering buffer中时才在渲染过程中出现。一般来说,没有通常“color”意图的结构体或类。AGG总是对具体的颜色空间进行操作。这儿包括的颜色空间有很多种,如RGB,HSV,CMYK等。这些颜色空间通常有特定的限制。比如,RGB空间就只是人眼可见颜色的一个很小的子集,下图中的三角形区域。
CIE 色品图和RGB色域
换句话说,在真实世界中有很多颜色是不能用RGB,CMYK,HSV等颜色空间来描述的。除了自然中存在的,任何一个其他颜色空间都是受限制的。因此,为了避免在将来可能出现的限制,没有引入一个如“color”般的对象。
3. 坐标单位
AGG主要使用输出设备的坐标。在屏幕上就是像素。但是不同于其他一些库和API,AGG支持亚像素精度。这意味着需要用浮点数描述坐标,因为小数部分的值也将会产生影响。为了不限制使用者的自由,AGG中没有嵌入从世界坐标转换到屏幕坐标的转换机制。当不同的应用软件中需要不同的近似方式时,这就显得很重要了。AGG只是提供了从view port到设备的变换器。可以添加自己的简单的类来以毫米、英寸或是其他物理单位为单位进行转换。