3

我对覆盖率的工作有疑问。覆盖率值指定像素的哪些样本被基元覆盖。使用 alpha to coverage,我们将 alpha 值与像素的覆盖率值相乘以确定最终的覆盖率。现在 Superbible 指定“如果 66% 的像素被基元覆盖且 alpha 值为 40%,则最终覆盖值将为 60 x 40%,即 25%,对于 8 个样本缓冲区,将覆盖 2 个样本。” 但是它在样本级别是如何工作的?它如何确定要覆盖 8 个样本中的哪些样本?

如果覆盖范围是每个样本的位字段,那么如何对每个样本执行 AND 操作?

4

1 回答 1

3

但是它在样本级别是如何工作的?它如何确定要覆盖 8 个样本中的哪些样本?

这完全取决于实施。如果 aplha 为 0.5,那么GL_SAMPLE_ALPHA_TO_COVERAGE将只创建一个包含一半可用位集的覆盖掩码(考虑抖动)。

GL 规范实际需要的只是(引用GL 4.5 核心配置文件规范的第 17.3.3 节):

将样本 alpha 值转换为临时覆盖率值不需要特定的算法。临时覆盖中 1 的数量与片段的 alpha 值的集合成比例,所有 1 对应于所有 alpha 值的最大值,所有 0 对应于所有 alpha 值是 0。 alpha 值用于生成覆盖率值的范围被限制在 [0; 1]。该算法还旨在本质上是伪随机的,以避免由于规则覆盖样本位置而导致的图像伪影。该算法可以并且可能应该在不同的像素位置有所不同。如果确实不同,则应该相对于窗口而不是屏幕坐标来定义它,以便渲染结果相对于窗口位置是不变的。

那么你的下一个问题很容易回答:

如果覆盖范围是每个样本的位字段,那么如何对每个样本执行 AND 操作?

AND 操作应用于GL_SAMPLE_ALPHA_TO_COVERAGE由覆盖样本创建的临时覆盖掩码和片段覆盖掩码。

于 2015-05-03T02:05:59.400 回答