[翻译]AGG reference 之 Scanline Containers
Introduction
(译注:这篇 reference 好像没有写完,所以下面只是将官方释出的部分进行了翻译)
原文链接:http://www.antigrain.com/doc/scanlines/scanlines.agdoc.html
翻译:唐风
底层的 render 操作的是最简单的数据形式,当然它们本身也很简单。其实 pixel format renderer 并不是 AGG 必须的组成部分,它们是可以替换或是改写的。比如说,如果你有一个功能相似的 API,而且这个 API 带有硬件加速,那么使用这个 API 来代替纯软件的混合渲染(主要是 alpha 混合)会更好。当然,也可以使用 Intel SSE/SSE2 来编写优化过的 renderer。AGG 其它的渲染功能都是基于这些简单的类。
描画去锯齿的对象时我们首先要对它进行光栅化。AGG 中主要的光栅化技术是基于 scanline 的,也就是说,一个多边形会先转换成很多的水平扫描线,然后再逐个描画这些扫描线。同样的, scanline rasterizer 并不是唯一可以用于生成水平扫描线(scanline)的类,你也可以使用一些容器,甚至是你自己的 super-ultra-mega rasterizer 。
在从 rasterizer(光栅化器) 到 scanline renderer 之间的信息转换时,用到了 scanline 容器。一个 scanline 由很多的水平的、不相交的 span 组成。这些 span 按 x 轴排序。这就意味着并没有提供排序这个操作,必须在将 span 添加到 scanline 时就把顺序处理好。如果顺序不是按要求排列的,那么可能会出现未定义的行为。
AGG 中有以下三种 scanline 容器。
- scanline_u - 未包装的 scanline 容器。
- scanline_p - 包装过的 scanline 容器。
- scanline_bin - 原始的,“带锯齿”的 scanline 容器。
前面两种容器可以包含去锯齿信息,第三种不行。
重要信息!
所有的 scanline 容器都为速度进行过优化,但没有考虑内存用量。事实上,它们会为最坏情况申请内存,所以有开销有点大。如果你只是使用少量的 scanline 的话,这不会成为瓶颈,但如果为存储整个形状而使用 scanline 的数组可能不是一个好主意,因为这会使用超出结果图像大小的内存量。
包装的(packed) scanline 与未包装的(unpacked) scanline 的区别在于, unpacked scanline 总是会为所有像素保存覆盖值(coverage value),包括那些全部覆盖在多边形内部的像素。而 packed scanlines 则会把具有相同 coverage value 的像素合并成 solid span。
看起来好像使用 packed 版的 scanline 总是会好一点,但在实践中并非如此。但你渲染一些大型的实心多边型时,使用 scanline_p 会更快,那是因为多边型的面积比周长要大很多(从像素的角度来衡量)。但是如果是渲染字符的时候绝对应该使用 scanline_u ,这样就能处理更少的 span 了,(scanline_u 会比 scanline_p)大约少产生三倍左右的 span,而 span 数本身就是一项重要的开销。同样的,在大多数 span 产生器中(比如 gradients, Gouraud shader, 以及 image 产生器等),span 的数量更加是(效能的)关键,所以一般也不会使用 scanline_p。