介绍
许多主线矢量图形渲染引擎都存在算法缺陷。它们分别渲染每个形状,并通过计算像素覆盖率来消除锯齿,然后将它们彼此叠加在一起。是的,它很简单,但是正确的解决方案甚至更简单。
这就导致了合并问题,因为它通过透明性扩大了覆盖范围。Alpha混合遵循的规则不能准确表示情况,例如,以50%覆盖的像素与50%互补覆盖的像素相邻的像素,其覆盖率最终不会达到100%,而覆盖率最终达到75% 。它的外观取决于算法的调整方式和其他细节,但从本质上讲这是一个已知的错误。甚至有人在记录不同的引擎错误以及写一篇论文说明如何更好地解决问题方面费了很多力气。
图像1:完全不具有代表性的示例,呈现的形状是由三角形组成,在顶部显示放大的误差。SVG来源
这个问题有一个简单的天真解决方案*,只是超级样本,没有覆盖率计算,并且将图像过滤掉。作为奖励,您可以使用比框滤波更好的图像重建算法(请参阅像素不是正方形3)。甚至有些解决方案的速度可以与当前解决方案相提并论,并且这些解决方案在硬件光栅化管道中更容易实现(并且您在GPU上很少看到此错误,因为它是为避免这个问题而构建的)。
这也不是没有成本的问题。有许多从事图形设计工作的人花费大量时间来尝试手动解决此问题,方法是确保此处没有重叠,而那里没有重叠以解决计算机应为他们解决的问题。而且在很多情况下都会失败。但是他们的客户不在乎为什么必须在那里解决错误。
题
错误如何传播?由于它们都在执行相同的错误,因此可以得出结论,他们对算法使用相同的源。是什么导致设计人员选择此算法?为什么只有3D程序员会识别此错误,甚至将其错误编入其API和教学中,而2D程序员却没有呢?
如何确保此错误不再继续传播?
附录(但我不是在问这个)
*显然,我声称超级采样无缺陷的工作是非凡的,并且需要非凡的证明。好的,所以超级采样工作的关键是超级采样不进行覆盖处理。本质上,超级采样器将每个样本视为点样本。由于点样本不假设基础区域,因此不会在没有发生的情况下进行alpha比较。
为了使其始终如一地工作,如答案之一所述。为了一致性,我们需要使用整数采样来处理样本。这可以确保每个点一旦转换为屏幕空间,对于相同的坐标都将获得完全相同的解决方案,并且没有任何样本被像素边界遮挡2次。要做到这一点,一个样本可能不会触发一个像素,如果它是例如左侧底部样本,则它可能不会完全打开(因此我们制定了一条规则,即在> vs <=中处理确切的边缘)。除一个控制台图形卡外,其他所有图形卡都按此方式工作。它确保不需要缓存额外的数据,也不需要进行额外的附近测试。与基于覆盖的解决方案相比,该解决方案更稳定,更通用,更一致。
该算法与原始算法完全相同,但代码更少,样本更多。因此,与基于覆盖的算法相比,它甚至是一致的。我们之所以知道这一点,是因为我们几乎在其他任何信号处理领域以及图形卡中都使用了这种方法。
那么这种方法有缺点吗?好吧,如果您只是天真的假设,那就慢了一点。从理论上讲,它比覆盖范围栅格化器具有更快的渐近行为,有点像光线跟踪器,它在典型场景中仍仅处于同等水平。同样,这可能会使基于卷积的效果的使用更加难以实现。