覆盖率-算法中的缺陷-如何摆脱它的使用?


10

介绍

许多主线矢量图形渲染引擎都存在算法缺陷。它们分别渲染每个形状,并通过计算像素覆盖率来消除锯齿,然后将它们彼此叠加在一起。是的,它很简单,但是正确的解决方案甚至更简单。

这就导致了合并问题,因为它通过透明性扩大了覆盖范围。Alpha混合遵循的规则不能准确表示情况,例如,以50%覆盖的像素与50%互补覆盖的像素相邻的像素,其覆盖率最终不会达到100%,而覆盖率最终达到75% 。它的外观取决于算法的调整方式和其他细节,但从本质上讲这是一个已知的错误。甚至有人在记录不同的引擎错误以及写一篇论文说明如何更好地解决问题方面费了很多力气。

在此处输入图片说明

图像1:完全不具有代表性的示例,呈现的形状是由三角形组成,在顶部显示放大的误差。SVG来源

这个问题有一个简单的天真解决方案*,只是超级样本,没有覆盖率计算,并且将图像过滤掉。作为奖励,您可以使用比框滤波更好的图像重建算法(请参阅像素不是正方形3)。甚至有些解决方案的速度可以与当前解决方案相提并论,并且这些解决方案在硬件光栅化管道中更容易实现(并且您在GPU上很少看到此错误,因为它是为避免这个问题而构建的)。

这也不是没有成本的问题。有许多从事图形设计工作的人花费大量时间来尝试手动解决此问题,方法是确保此处没有重叠,而那里没有重叠以解决计算机应为他们解决的问题。而且在很多情况下都会失败。但是他们的客户不在乎为什么必须在那里解决错误。

错误如何传播?由于它们都在执行相同的错误,因此可以得出结论,他们对算法使用相同的源。是什么导致设计人员选择此算法?为什么只有3D程序员会识别此错误,甚至将其错误编入其API和教学中,而2D程序员却没有呢?

如何确保此错误不再继续传播?


附录(但我不是在问这个)

*显然,我声称超级采样无缺陷的工作是非凡的,并且需要非凡的证明。好的,所以超级采样工作的关键是超级采样不进行覆盖处理。本质上,超级采样器将每个样本视为点样本。由于点样本不假设基础区域,因此不会在没有发生的情况下进行alpha比较。

为了使其始终如一地工作,如答案之一所述。为了一致性,我们需要使用整数采样来处理样本。这可以确保每个点一旦转换为屏幕空间,对于相同的坐标都将获得完全相同的解决方案,并且没有任何样本被像素边界遮挡2次。要做到这一点,一个样本可能不会触发一个像素,如果它是例如左侧底部样本,则它可能不会完全打开(因此我们制定了一条规则,即在> vs <=中处理确切的边缘)。除一个控制台图形卡外,其他所有图形卡都按此方式工作。它确保不需要缓存额外的数据,也不需要进行额外的附近测试。基于覆盖的解决方案相比,该解决方案更稳定,更通用,更一致

该算法与原始算法完全相同,但代码更少,样本更多。因此,与基于覆盖的算法相比,它甚至是一致的。我们之所以知道这一点,是因为我们几乎在其他任何信号处理领域以及图形卡中都使用了这种方法。

那么这种方法有缺点吗?好吧,如果您只是天真的假设,那就慢了一点。从理论上讲,它比覆盖范围栅格化器具有更快的渐近行为,有点像光线跟踪器,它在典型场景中仍仅处于同等水平。同样,这可能会使基于卷积的效果的使用更加难以实现。


工作结束后,将为我的附录添加图片。毕竟,这是图形处理,它具有视觉效果
joojaa

Answers:


6

如果天真地进行超级采样,在计算上会非常昂贵,因为例如,如果使用显示器像素大小的一半,则需要四倍的内存和带宽。Wikipedia提到了这一点,也将自适应超采样命名为可能的解决方案。但这开始使算法更加复杂,复杂且难以实施。

我想这就是您要寻找的原因:如果您想要一种不需要太多内存和运行时间的算法,那么比天真的“透明”方法要复杂得多。


您实际上不需要存储所有样本,只需存储栅格化设置即可。基于coverage的方法也不会存储它们,因此这不是向后退一步。之所以提供朴素的方法,是因为它易于理解,可以轻松进行基于优先级的采样。另外,如果要将基于覆盖的解决方案移至GPU,则需要做很多额外的工作,并且与它的模型不兼容。
joojaa

@joojaa:您可以概述“存储栅格化设置”是什么意思,还是提供一个链接,在其中解释该方法,而无需深入研究20页以上的科学论文?
布朗

每个像素彼此独立,因此在处理像素时只需要保存样本,此后就可以安全地丢弃它们。如果要使用更高阶的拟合器,则只能存储有限的视图。因此,您真正需要做的就是为处理核心分配内存,以便(每个线程16-256字节)
joojaa

哦,对不起,如果您进行框式过滤,甚至都不需要存储样本,您只需使用移动/运行平均值的公式即可,而无需存储单个样本
joojaa

@joojaa:我不明白-您是否不需要首先计算所有相关形状(可能是数百个或数千个)的样本,然后再过滤到您的栅格显示?
布朗

6

总体而言,超级采样无法解决问题:这只会使其不那么引人注目。使用一半大小的像素,问题将减少一半,但不会消失。

这些设计背后的体系结构点是我们希望“渲染三角形ABC”命令具有明确的含义。我们不希望它是模棱两可的,除非将其视为绘图命令集合的一部分–例如,当“ render triangle BCD”也包含在集合中(具有相同或不同的颜色)时具有一种含义,而在绘制命令集合中也具有另一种含义。不是。

例如,考虑一千个三角形,即使找到与ABC共享一侧或一侧的一部分的所有三角形在计算上也很繁重(请记住,必须将其重做一千次)。还有许多其他实际问题:值得注意的是,所有原始渲染请求都必须保留,即使它们是很久以前绘制的,以防由于新的附加请求而需要重新评估。

最重要的是,一个完全一致的解决方案是不可行的。仍然存在一个问题:如果可以的话,我们应该尝试改善当前状况吗?通常,该问题的答案是“ ”。即使模型本身具有您已经说明的局限性,模型的完全一致实现也总是更好。另一种选择是实现有时会更好而有时却没有的实现,程序员无法知道这两种情况中的哪一种在任何特定情况下都适用。而且,由于程序员所做的微小更改,甚至是程序员无法控制的更改,它可能会从“做得更好”跳到“做不到”。在编程环境中,可预测性远非如此,


如果我的超级采样不进行覆盖率计算,那么这是覆盖率计算的问题,那么它就没有问题,因为它将收敛到实际答案,而不仅仅是减少了问题。您是否需要一些代码来证明这一点?这是您的图形卡的工作方式,并且不会出现此问题。否则,您看到的每个游戏都会出现问题。我不买这个答案,因为它是基于错误的逻辑。
joojaa

@joojaa游戏要么不执行任何抗锯齿处理,要么使用超级采样进行抗锯齿处理,这通常会提供四个级别的抗锯齿处理。对于演示质量的图形,这还不够好,您需要大约64个级别的抗锯齿。因此游戏将一个问题换成另一个。
皮特·柯坎

@PeteKirkham取决于您的设置,有些游戏玩家可以指定样本数量。无论如何,如果您使用比框式过滤更高阶的过滤器,则不需要超过16个样本即可产生表示水平的AA。请注意,在我的示例IS中,通过在硬件reasterizer内部进行超采样来完成无错误映像。
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.