如何准确计算重叠分析曲线的覆盖率?


10

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

如果您关心完全准确性,将如何计算?更棘手的是,如何为重叠的非多边形形状(如曲线)准确计算覆盖率?您别无选择,只能回到多重采样或随机技术吗?

Answers:


10

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

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

图片

图片1:渲染引擎​​使覆盖范围混乱,并在不应有轮廓的地方绘制了一个细的白色轮廓。

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

可以将情况简化为子像素级别的多边形,然后可以解决离散分析解决方案。但这是以牺牲灵活性为代价的。例如,将来的矢量系统可能希望允许可变宽度的模糊线,这与其他可变颜色的对象一样,对于解析解决方案来说是一个问题,这并非毫无疑问。

如何进行分析

分析场景

图片2:假设您有此场景,右侧是分解图

现在,您不能只是分析性地执行此操作,而是将每个部分分开然后合并数据。因为这会导致错误的数据。如果进行了混合,请参见alpha混合将使蓝色发光穿过间隙。

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

在此处输入图片说明

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

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

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

记得:

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

假设我们不太在乎效率。我们将如何对形状上的布尔运算进行覆盖率计算?这是可能的,还是仅适用于特定形状?
约翰·卡尔斯贝克

@JohnCalsbeek确定即时通讯开始建立解析答案,其将需要一段时间
joojaa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.