我目前正在尝试了解有关矢量图形栅格化的一些知识,以及在各种应用程序类型中实现矢量栅格化的不同方法。光栅化过程中抗锯齿的方式。我对Illustrator中的渲染行为特别感兴趣。通过进一步阅读,您会明白为什么。
矢量图形软件

这是Illustrator,Affinity和Inkscape中三个矢量图形的渲染。 (在Affinity和Inkscape中生成的图像完全相同。)



您可以看到,渲染的图像的每个边缘上都有不希望的白线亲和力和Inkscape。抗锯齿不会用纯色填充此区域,从而不会在相邻形状之间形成较小的间隙。

尽管Illustrator渲染中没有间隙,但是形状的边缘看起来像Affinity渲染。

此处的图像显示了放大后每个图像的相同区域。



两个图像。 Affinity渲染稍微更平滑,但在查看原始大小的图像时几乎看不到差异。

浏览器

SVG渲染

在浏览器中显示与SVG导出的相同图形看起来与Affinity和Inkscape生成的光栅图像非常相似。


在边缘抗锯齿(在这里不值得展示),但是在常见的浏览器中SVG光栅化的行为几乎相同。在对Illustrator进行进一步的测试时,我尝试将图形的各个部分分开并分别导出,然后再使用光栅编辑软件将它们重新组合在一起。结果与使用同一方法得到的图像相同,但是使用此方法得到的结果略有不同。他们之间有一个很小的差距。尽管它更加微妙,但它与Affinity中的图形非常相似。

多边形渲染

Blender(3D软件) br />
Blender允许您导入SVG文件并将其作为曲线对象进行操作。这是3D视口中显示的导入图形。 (默认情况下,材质将受到场景中灯光的影响。在材质属性面板中检查无阴影属性将允许使用原始颜色渲染形状。) Blender内部的SVG。



三角形之间没有任何间隙。其他3D软件很有可能以相同的方式工作。那么Blender的行为就像Illustrator一样吗?

真正的问题


Illustrator在幕后使用了哪个矢量绘图库?
是否可能Illustrator使用了一种3D渲染引擎?它是开源的吗? (可能不是吗?)
任何著名的矢量绘图库,例如Cairo和Skia,都可以实现相同的渲染行为吗? (形状之间没有间隙)
那里是否存在鲜为人知的具有相同行为的矢量图形库?


评论

其他常见的渲染器也存在此合并问题。参见w3.impa.br/~diego/projects/GanEtAl14/sample.html?contour。

#1 楼

据我所知,Illustrator有2或3种不同的光栅化器。屏幕预览还经过调整以最大程度地减少效果,因此也容易产生与您的节目相同的间隙失真。您的帖子似乎暗示您对“经过艺术优化的”输出感兴趣。



图像1:插画家的不同渲染模式。美术在左侧优化,在右侧提示。请注意,提示显示略有背景。我没有新的CC版本,所以我无法显示第三个CC版本。更高的分辨率,然后进行了框滤波。这称为昂贵的超级采样。盒子过滤器只是盒子中样本的平均值(像素)。实际上,这与搅拌器渲染中使用的多像素滤镜使用的技术类似。您可以手动执行相同的操作并获得相同的结果。

实际上,您从illustrator获得的渲染效果不是很好。它在非线性空间中渲染并且未经校正,可以通过交换到更高阶的滤镜并在线性颜色空间中进行计算来获得更好的结果。所有的多样本方法都呈现出相同的正确渲染效果(给出足够的样本甚至在数学上都是正确的)。 。在16x16像素的同一幅图像的右侧,具有线性空间中的多瓣Lanczos滤波器。确保您的缩放比例为1:1。他们试图避免多次抽样,以求覆盖率计算。但这根本不能完美地工作!仅仅是因为alpha混合是:

$$ c_0 = c_1 * \ alpha + c_2 *(1- \ alpha)$$

当链接在半透明表面上时,永远不会达到0,因此背景显示为低谷。而且它不知道覆盖范围是如何分布的,因此会做错。在这种不重叠的情况下,根本无法解决此问题。但是如果您允许形状重叠,则可以解决覆盖率计算(请参见此处)。

其他问题您只需对非抗锯齿图像进行多重采样,即可在其他任何引擎中获得相同的结果。如果不进行重叠技巧,就无法在屏幕渲染中获得效果,因为它们会优化速度。插画家使用3D吗?新CC可能取决于您对3D是什么的解释。这个问题与3D信号重建方法无关,因此它实际上不适用于此问题。重叠曲线



评论


$ \ begingroup $
BTW,要更详细地了解为什么在这种情况下alpha混合不能“做正确的事”,请查看本文:Andrew Glassner的Alpha解释。
$ \ endgroup $
–内森·里德(Nathan Reed)
15年12月24日在21:34

$ \ begingroup $
@NathanReed看起来很不错,但是这里即使Alpha正常工作,覆盖率也不会知道哪些部分覆盖了像素,哪些没有覆盖。因此,具有50%alpha的两层可能意味着完全不透明或只有一层可见,因为对象填充了我们所不知道的相同区域。
$ \ endgroup $
– joojaa
15年12月24日在22:06

$ \ begingroup $
@joojaa是的,这基本上就是论文的重点:alpha可以表示不透明度,覆盖率或两者的组合。 :)
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年12月25日,0:15

#2 楼

只需添加一下:这就是所谓的“合并”工件,这就是AntiGrain Geometry使用复合形状栅格化器的目的,请参见:

flash_rasterizer.png http://agg.sourceforge.net/antigrain。 com / demo / flash_rasterizer.png

此外,这也是NV Path Rendering声称需要改进的地方:


NV_path_rendering简介(第67页)或NV_path_rendering常见问题解答(#29)。