2D形状的抗锯齿归结为计算该形状所覆盖的像素分数。对于简单的不重叠形状,这并不是太困难:将形状裁剪到像素矩形上并计算结果形状的面积。但是,如果多个形状与同一像素重叠,则会变得更加困难。如果忽略某个形状覆盖另一种形状的数量,仅对面积求和可能会导致计算的覆盖率过高。例如,请参见有关字体渲染的本文“限制”部分。您可能还会遇到两条曲线来自具有不同颜色的不同对象的情况(因此,这与两个形状的并集的总覆盖率无关,而是分别覆盖每个形状的覆盖率)。 >如果您关心完整的准确性,该如何计算?更棘手的是,如何为重叠的非多边形形状(如曲线)准确计算覆盖率?当您别无选择时只能回到多重采样或随机技术吗?

#1 楼

对于所有极端情况,实际上没有很好的方法可以有效地进行分析。尝试进行分析覆盖率计算的大多数或所有商业2D渲染器都会产生可预见的错误,而多重采样方法却无法做到。

一个典型的问题是两个重叠的形状共享相同的边缘。常见的情况是Alpha通道的总和是太厚的Alpha边缘,略有混叠。或者,如果形状的颜色不同,则系统会混淆背景的颜色。这非常烦人。



图像1:渲染引擎​​混淆了覆盖范围,并在不应有轮廓的地方绘制了白色的轮廓。

第二个完美的覆盖范围相当于盒子过滤。我们当然可以做得更好。考虑到有很多特殊的拐角情况需要对形状进行布尔运算才能正确执行,因此超级采样仍然是更好的选择。实际上,覆盖率估计值可用于最可能需要的地方集中采样。

情况可以简化为亚像素级的多边形,然后可以解决离散分析方法。但这是以牺牲灵活性为代价的。例如,将来的矢量系统可能希望允许可变宽度的模糊线成为问题,这对解析解决方案会造成问题,就像其他可变颜色的对象一样。

如何进行解析地实现



图像2:假设您有这个场景,右侧是分解图

现在您不能仅仅通过分析来做到这一点,每个部分分别然后合并数据。因为这会导致错误的数据。请参见alpha混合,如果这样做的话,会让蓝色的光芒穿过缝隙。

,您所要做的就是将场景拆分开,以便每个形状都消除另一个形状:



图像3:您需要切割下面的表面。

现在,如果一切都是不透明的,那么一切就简单了。只需计算每块的面积,然后乘以颜色,然后将它们相加即可。现在,您可以使用类似的东西。

,如果您的个人形状不是不透明的,那么一切都会崩溃,即使可以在某种程度上完成。


AA计算需要在线性色彩空间中进行,然后转换回使用空间。


评论


$ \ begingroup $
说我们不太在乎效率。我们将如何为形状上的布尔运算进行覆盖率计算?这是可能的,还是仅适用于特定形状?
$ \ endgroup $
– John Calsbeek
2015年8月9日在23:18

$ \ begingroup $
@JohnCalsbeek好的即时消息开始建立分析性答案,这需要一段时间
$ \ endgroup $
– joojaa
15年8月12日在17:50