传统形态抗锯齿 2.0

摘要

我们介绍了原始传统形态抗锯齿 (CMAA) 算法的更新,包括我们称之为 CMAA2 的全新 DirectX* 计算着色器。该版本可提供更高的性能、改进的质量、与多示例抗锯齿 (MSAA) 的可选集成以及在提供相应支持的图形处理单元 (GPU) 上的异步利用。本文还介绍了抗锯齿 (AA) 后处理技术的一些弱点,回顾了这些技术可有效运行及有时对 MSAA 解决方案进行补充的场景。我们使用公开版 Amazon Lumberyard* Bistro 场景的测试表明,相比于快速近似抗锯齿 (FXAA),CMAA2 可提供同样出色、甚至更佳的抗锯齿性能,并以大致相似的性能保持更高的输入图像锐度。当分辨率较高时,CMAA2 可实现相同、甚至更快的速度,具体取决于硬件。我们还介绍了多项硬件和分辨率配置的质量和性能,以及 DirectX* 11 DirectCompute 5.0 示例应用的源代码。

C M A A 2 resolution scene
图 1.左侧图像未启用抗锯齿。第二幅图像显示仅应用了 CMAA2。第三幅图像仅应用了 8xMSAA,相比第二幅图像在餐巾架和其他几何结构上实现了更出色的子像素 AA,但在阴影处没有 AA 。右侧图像应用了 4xMSAA 和 CMAA2,相比仅使用 8xMSAA 的情况能够以更低的总计算成本实现更出色的 AA。

简介

我们介绍了基于映像的传统形态抗锯齿 (CMAA) 算法的更新,并讨论了性能和质量平衡以及与多示例抗锯齿 (MSAA) 的集成。相比过去的版本,此更新版本提升了抗锯齿质量和性能。1 此外,我们还从像素着色器迁移至一系列计算着色器,它们可提升硬件性能,支持同步执行图形和计算命令队列中安排的工作。这些计算着色器为 DirectX* 计算着色器 5.0,我们提供了其在 DirectX 11 中的示例实施方案。最后,我们讨论了如何结合使用 CMAA 和 MSAA,以及这两种方法如何相互补充。

虽然我们专注于通过优化提升英特尔® Integrated Native Developer Experience(英特尔® INDE)显卡的性能,但我们也努力确保该算法能够在其他厂商的最新独立图形处理单元 (GPU) 上高效运行。我们欢迎社区成员帮助优化该实施方案。

从像素着色器迁移至计算着色器为我们带来了多项优势。第一,我们可同时安排硬件任务,通过异步计算同步执行图形和计算。第二,我们可利用像素着色器中没有的共享本地内存,避免使用昂贵的内存。第三,相比完全实施像素着色器,我们可通过利用间接调度功能提升 GPU 计算资源的利用率,尤其是对于依赖像素着色器分支功能的形状检测和解析。其他优势请见第 2 部分,我们在该部分介绍了新方案相比前代 CMAA 的改进。

在本文,我们将使用 CMAA2 表示 CMAA 2.0。

传统和形态的意义

我们使用“传统”表示对锯齿伪影分类和解析的独特方法,该方法用于保持输入图像的总体锐度,同时提供清晰的锯齿结果。换言之,我们的抗锯齿启发法以两个目标为指引:尽可能接近地面真值,同时最大限度减少输入图像变更。我们使用“形态”表明算法与原始形态抗锯齿属于相同的算法类别。2

为何集成多示例抗锯齿 (MSAA)?

鉴于 SMAA 与 2xMSAA (SMAA S2x) 3的成功集成,我们有理由研究 CMAA 与 MSAA 的集成。第一,MSAA 旨在解决光栅化伪影,无助于解决像素着色过程中出现的锯齿问题。因此,将示例数量增加至 4 个或 8 个以上会降低收益,并大幅增加成本。不会受益于 MSAA 的锯齿来源包括大功率高光元素、清晰的阴影图、甚至光线跟踪阴影(请见 John Story 的“混合光线跟踪阴影”)。4 第二,由于 MSAA 在一些集成 GPU 上的效率不尽人意,在某些场景中增加示例数量的成本过高。我们能够证明 CMAA2 与 MSAA 的集成相比二者单独使用具有显著优势,能够实现一加一大于二的效果。具体而言,我们可证明 4x MSAA 搭配 CMAA2 可提供高于 8xMSAA 的质量,同时保持相当或更低的总体性能成本(具体取决于图形硬件)。相关结果请见第 6 部分。

以往的后期处理抗锯齿工作

计算机图形专家研究抗锯齿技术已有多年。在本文中,我们仅引用主流的后期处理技术,所有这些技术会不断向超级示例抗锯齿 (SSAA) 图像的目标靠近,仅考虑目标帧缓冲器中以帧缓冲器分辨率生成的像素。在包含时间取样的一些情况中,如 SMAA T2x,这些技术还会利用以前生成的帧缓冲器。Sungye Kim 的“时间稳定传统形态抗锯齿”文章介绍了采用早期 CMAA2 实施的集成时间取样。5

我们回顾了后期处理,并建议读者查阅本调查报告,以及针对取样后期处理抗锯齿技术的已上市游戏的调查报告,以了解更多背景信息。6 这方面的工作正在广泛展开,让我们看看四个重要的实施方案。首先,我们将会描述我们技术的基础性形态抗锯齿 (MLAA) 及其他算法。其次,我们将回顾广泛用作极速后期处理抗锯齿技术的快速近似抗锯齿 (FXAA)。我们还将回顾子像素形态抗锯齿 (SMAA),它被用于 CRYENGINE* 和其他许多游戏引擎。7 最后,我们将更新与过去的 CMAA 进行了比较。

后期处理方法

形态抗锯齿 (MLAA)

Alexander Reshetov 有关 MLAA 的论文在后期处理抗锯齿领域产生了重大影响。2 MLAA 最初被用作 CPU 端后期处理技术,非常适合但又不局限于光线跟踪。在此次开创性应用之后,该技术被用于 GPU。8在 Reshetov 的实施方案中,色彩空间的边缘被分类为 Z、U 或 L 形状,其中 Z 和 U 形状可分解为 2 个 L 形状,如下图所示。本文并未详述相关信息,如需了解更多详情,建议查阅上述论文。

Shapes classified in the original M L A A paper
图 2.上述 MLAA 论文进行的形状分类。从左至右:Z、U 和 L 形状。这些形状对应着旋转 90 度、180 度和 270 度的图案。由于 Z 和 U 形状可分解为 L 形状,MLAA 实施方案只需将 Z 和 U 分解为 2 个 L 形状的子元素。

在最后阶段,所有 L 形状将进行混合,即混合触及所包含边缘的像素的颜色。为支持混合,需确定一个主要和次要边缘,主要边缘为第一个步骤中的边缘,次要边缘为第二个合并阶段中的边缘。有趣的是,次要边缘仅有一个像素的长度,即使上一阶段检测的属于次要边缘的像素数更多。这有助于提高安全性,因为该阶段中未处理器的其余像素将被作为单独的形状独立处理。基于所占用的每个像素的面积的加权平均数来混合像素,该加权平均数是通过从次要边缘的中点到主要边缘的最远顶点绘制线来找到的。

快速近似抗锯齿 (FXAA)

与其他后期处理技术一样,FXAA 可推理出色彩空间中的边缘,且仅在这些边缘上运行,以最大限度减少计算量。下面介绍了现有 FXAA 的价值定位:

  • 在 GPU 上执行,可通过调整参数以及用于过滤的 tap 数量,改变性能与质量的平衡。9,10
  • 轻松集成至当前的渲染引擎
  • 改进图像质量,最大限度抑制帧速下降

FXAA 是一种深受欢迎且实用的后期处理技术,尤其在延迟渲染方面。Timothy Lottes9有关 FXAA 的文章描述的实施方案在彩色图像上部署单通道,集成了从红色和绿色通道中精确估计亮度的功能,发现蓝色锯齿很少出现在游戏内容中。“实时抗锯齿过滤方法”中描述的计算10 仅限于最近的相邻像素,可选择将滤波宽度增加至多达 8 个像素。我们使用公开提供的实施方案。11我们使用带默认设置的 FXAA 版本 3.11 进行测试和比较。

子像素形态抗锯齿 (SMAA)

SMAA 是原始 MLAA 的演进版本12,可处理过去推出的后期处理技术无法解决的许多问题,包括局部对比度调整 (LCA),可改进锐角、对角线段、子像素特征、动作和镜面锯齿的处理。SMAA 具有出色的模块性,可适应质量与性能的离散设计点。例如,低端硬件目标可能选择采用这些特征,以处理对角线段和局部对比度问题,但可能忽略时相阶段。同样,高端目标可能采用所有功能,实现比高带宽 MSAA 更出色的性能和质量。我们使用公开提供的带默认设置的 SMAA 进行测试和比较3

CMAA2 及其相对于旧版 CMAA 的改进

英特尔发布了 CMAA 的早期版本。1 该版本基于像素着色器,在多款游戏上实现了商用,如 CodeMaster* 的《超级房车赛:起点2》。13 我们对这一早期版本进行了改进,详情请见下文。

  • 形状检测启发法是基于参数改进的,这些参数提供了更接近于在真实独立的工作负载上测试的地面真值图像的解决方案,以及来自流行的 3D 内容的多次图像捕获,同时进一步最小化高频纹理或包含文本的区域的变化。
  • 我们最大限度减少了内存带宽的使用,支持性能有效扩展至高分辨率渲染目标。例如,输入/输出图像仅在需要抗锯齿以避免全屏复制操作(常见于像素着色器实施中)的区域修改完成。此外,我们还在可能的情况下将共享本地内存用于中间数据存储,并将高效编码功能用于 RAM 中存储的任何中间数据。
  • 我们使用计算着色器实施了该算法,以充分利用可用的异步计算功能。
  • 我们一次处理 2x2 像素方块,能够减少启动的线程总数,通过一个线程处理更多工作,将示例重复用于多个像素,从而减少内存读取。此外,边缘检测结果可重复用于构成方块的像素。
  • 我们支持 CMAA2 与 MSAA 集成。
  • 我们通过 DirectX DispatchIndirect() 方法在 GPU 上利用间接执行,相对于像素着色器方法可减少工作量,后一种方法可能需要效率较低的分支或模板掩码。14
  • 我们支持基于 log-luma 的边缘检测和高动态范围 (HDR) 颜色缓冲器抗锯齿。
  • 全新的实施方案解决了以往版本中竞争关系问题;在混合重叠水平和垂直形状时,该问题会导致闪烁,即便摄像头没有移动。

TSCMAA 1.0

英特尔发布了最近实施方案的时间稳定调整版,以增强原始 CMAA —— 时间稳定传统形态抗锯齿 (TSCMAA) —— 的帧到帧一致性。5 实际上,更新原始 CMAA 以用于 TSCMAA 的呼声是我们发布 CMAA2 独立更新版的动机。此次更新进行了重大改进,我们认为,除了原始 TSCMAA 发布之后推出的更新,改进后的 CMAA 技术的许多细节足以证明改进的合理性。

输入
图像→

检测边缘

查找输入图像中的边缘,并对其进行存储以作后续评估之用


边缘
候选项→

处理边缘

对于每个边缘,计算新的加权颜色值,将结果附加至每个像素链接列表


每像素链接列表
的缓冲器→

解析

对于输出图像的每个像素,将加权平均数中的链接列表元素混合至输出缓冲器


输出
图像

概述 CMAA 2.0 算法的三个主要阶段。每个阶段采用一个独立的计算着色器,并利用前一阶段的数据计算最终渲染目标。下面详细描述了每个阶段。

CMAA2 概述

本部分概述了我们的 CMAA2 算法。我们比较了目前市场上的两款主流后期处理抗锯齿解决方案:FXAA 和 SMAA。

简要概述 – 查找和处理形状

区分不同后期处理抗锯齿技术的一个方法是,了解它们识别的锯齿形状,以及如何通过与相邻像素混合利用这些形状进行抗锯齿。通过总结 Reshetov 和 Jimenez 的演讲6,我们可将 MLAA 或 SMAA 的要点概括如下:

  1. 查找分隔具有不同颜色的像素的轴对齐线(边缘)
     

    M L A A edge detection step
    图 4.MLAA 边缘检测步骤。

  2. 重构连接邻近水平和垂直分隔线的像素的轮廓线,解决模糊问题,支持较长的形状轮廓,并考虑所生成的形状。
     

    M L A A shape classification and revectorization step
    图 5.MLAA 形状分类和二次矢量化步骤。

  3. 对于轮廓线分隔的每个像素,其颜色与分隔线对面的像素颜色进行混合,权重与梯形区域成一定比例
     

    M L A A blending step
    图 6.最终的 MLAA 混合步骤。

CMAA2 使用类似于上述第一步(图 4)的第一步,那个步骤找到了分隔具有不同颜色的像素的轴对齐线(边缘)。

然而,与 MLAA(和 SMAA)的基本差异在于轮廓线重构后的形状分类规则。CMAA2 仅对一个主要形状类型 – 对称的 Z 形状 – 进行分类,而 MLAA 和 SMAA 可对 Z、U 和 L 形状进行分类。

C M A A 2's symmetrical Z-shape
图 7.CMAA2 的对称 Z 形状示例。

CMAA2 Z 形状从一行或一列过渡至下一行或一列始终需要一个像素的高度和宽度,臂 (arm) 会进行适当延伸,以对各边的断裂颜色边缘进行走查,但一个臂的长度不可大约另一个臂的长度乘以一个常数,如 1.2、1.3 或 2,它们的总长度必须达到 4 个像素。

最后,实施混合的前提条件是,底层几何结构的轮廓是两个 Z 形状臂中心之间的直线。

C M A A 2's symmetrical Z-shapes
图 8.基于 CMAA2 对称 Z 形状的二次矢量化(红线)和混合。混合发生在 Z 形状的两个长臂的中点之间。

对称的 Z 形状分类和混合方法是 CMAA2 的核心,相对于 MLAA(及 SMAA)采用的方法具有更大的限制性。对称 Z 处理本身可避免过度模糊场景,在 SMAA 中,这一场景需作为特殊案例使用较长的交叉边缘条件进行处理,详情请见第 4.2 章 模式处理 – 锐化几何特征12

F X A A 3.11, S M A A, and C M A A 2
图 9.从左到右:源图像,FXAA 3.11、SMAA 和 CMAA2。

图 9 显示了在一个简单旋转正方形的简单合成示例中,FXAA、SMAA 和 CMAA2 的不同行为,以及锐度和角落处理方面的明显差异。下面,我们将讨论这些差异对实际场景的实际影响。

CMAA2 的简单形状

细心的人会发现,CMAA2 案例的角落存在一个像素的模糊,我们在前面已表明,检测对称 Z 形状的条件之一是,“各臂的总长度至少达到 4 个像素”。这会排除相关角落及部分其他锯齿伪影,如对角线。

CMAA2 使用单独的简单形状检测和过滤器处理这些案例。这个简单的形状过滤器可处理单个像素,在 12 个周围边缘上收集输入信息,如图 10 所示,并在像素及其 4 个相邻像素(左、上、右、下)之间实施二次矢量化和混合。混合加权计算基于相对简单的启发法(相关介绍请见实施详情)。该过滤器不会在主要对称 Z 形状先前处理的像素上执行。

C M A A 2's handling of secondary simple shapes
图 10.CMAA2 处理二级“简单形状”。蓝线表示 12 个用于为中心深绿像素进行混合的边缘,红线表示二次矢量化结果。

相比于 SMAA 的其他差异

CMAA2 尚未包括对角线锯齿模式高级处理,如使用预计算纹理获得更精确覆盖区域的 SMAA 方法(第 4.2 章模式处理 – 对角线模式,11)。这是因为我们在实施该方法时对性能产生了重大影响,而且在某些场景中降低了锐度,违背了一贯的做法。然而,我们仍在探索潜在的解决方案,因为在这个领域,SMAA 相比 FXAA 和 CMAA2 可实现更高的质量。

Handling of diagonals
图 11.处理对角线,从左开始:源图像、FXAA 3.11、SMAA、CMAA2

CMAA2 额外锐度模式

在实施过程中,我们多次需要在保持锐度和应用更多抗锯齿方面保持平衡。例如,用于边缘检测的局部对比度自适应的强度、处理对称 Z 形状限制、简单形状二次矢量化支持等。我们在全局“额外锐度”开关下捕获了这些设置,为用户提供了在两种模式之间切换的简单方法。在某些情况下,如文本和 UI 嵌入 3D 场景或艺术品包含清晰的高频率纹理,我们需要额外锐度。在某些情况下,更高的抗锯齿性能可产生更满意的结果。

Sharpness vs anti-aliasing
图 12.锐度与抗锯齿;从左开始:源图像,FXAA 3.11、SMAA、CMAA2、CMAA2-ExtraSharpness

实施概述

CMAA2 算法分为三个阶段:边缘检测、形状处理和解析。为便于您理解整个算法,我们将概述相关信息,然后单独描述基础算法的增强特性:

  1. 边界检测:在输入图像上,通过分析像素及其东西南北近邻之间的颜色变化,确定边缘。如果超过阈值,在每个方向上将其作为简单的二进制数值(是为 1,否为 0)编码至边缘纹理,我们分别使用 R、G、B、A 通道表示东、南、西和北,并将缓冲器输入图像的 (x,y) 附加至形状候选像素,它们将在下一通道中进行评估。形状候选像素可用作潜在的简单形状或潜在的复杂形状(对称的 Z 形状的中心),它们需要在下一阶段进行评估。此时不会进行颜色混合,输出仅包括边缘和候选像素。
  2. 形状处理:借助步骤 1 中识别的形状候选像素和边缘信息,我们可确定是在处理简单还是复杂的形状。如果是简单的形状,我们将计算像素及其近邻的加权平均值,并将结果作为 (x,y) 输入图像位置和新颜色值输入至延迟像素列表。如果使用比步骤 1 略微复杂的启发法将其确定为潜在的复杂形状,我们会对两边实施走查以进行全面的 Z 形状测量;如果达到要求的限值,我们将实施近邻混合,并将结果存储在简单形状所在的延迟像素列表。由于每个像素可能用于多个形状,我们稍后需要将其所属的所有形状的颜色结果进行混合。为此,我们创建了链接列表,并将所计算的新像素值附加到该列表中。在形状中的每个像素写出后,我们将节点添加至延迟颜色值的链接列表,并将头指标更新至新的头节点,以及将头节点更新至链接列表。我们之所以调用延迟颜色值,是因为我们延迟了将最终输出像素写入至下一阶段的操作。
  3. 解析:在步骤 2 后,我们获得了每个像素的一组混合颜色值,它们都需要并入最终的渲染目标。对于每个像素,我们会详细研究相关数值,使用加权平均数混合每像素结果。相比简单的形状,我们将对复杂的形状进行更多的加权操作,因为复杂形状的抗锯齿启发法更为准确,且具有优先级,而简单形状可填补差距。最终颜色写入输出缓冲器,形状的处理顺序不会影响数值。正因为形状处理和最终混合的分离,我们将最后一步称为延迟解析。

实施详情

在概述了 CMAA2 后,我们将介绍一下增强特性及实施方案的更多详情。首先,我们将描述基础算法的多项改进,包括使用间接调度和优化,提高从内存提取至高速缓存和寄存器的数据的利用率。然后,我们将描述用于内部数据结构的编码方案、共享本地内存的使用及与 MSAA 的互操作性。下一部分将逐一详细介绍实施方案的三个阶段。为支持这些优化,我们需要熟悉英特尔® 集成开发环境 GPU 的计算架构。相关信息可参考白皮书 英特尔® 处理器显卡 Gen9 的计算架构。此外,我们会假设读者熟悉 DirectX API 方面的术语,如共享组、间接调度和线程组。

CMAA2 增强特性

第 3 部分概述了 CMAA2 算法,我们将继续对其进行改进。我们将描述该版本的多项增强特性。此外,计算着色器模型 5.0 已经过了测试,可在 DirectX11 和 DirectX12 中高效运行。

利用间接调度

对以第二个(形状处理)和第三个(解析)阶段,我们利用间接调度高效合并和安排前一阶段的有用工作,避免处理不需要抗锯齿的像素。通过这种方式,我们还可将这一工作分为 14 个大小合适的最优线程组,它们与着色器共享本地内存(即 DirectX 高级着色语言 (HLSL) 中的[共享组])保持一致,最大限度降低寄存器压力。在设置间接调度调用时,我们在实施第二个和第三个主步骤前调用了两个不重要的 Compute Dispatch Argument 通道,为便于理解,相关信息在前面的描述中已略去。这一做法与我们的原始像素着色器 CMAA(和 SMAA)形成了鲜明对比,后者依赖于模板掩码避免后续通道中无需抗锯齿的不必要工作。相比间接调度方法,模板掩码在这方面的效率更低,需要花费较高成本进行输出,并结合像素着色器线程调度力度进行使用,从而导致一些多余遮掩像素,导致冗余线程的调度

以 2x2 微方块处理源色

在性能分析中,我们发现,处理每线程单个像素的首个计算着色器版本并未充分利用英特尔® 集成开发环境 GPU 上的硬件线程,实施了结果可与邻近像素共享的取样和数学运算。经过一些实验后,我们确定在每线程 2x2 微方块中处理像素可在启动线程组的前端和后端之间保持适当平衡,以及重复使用纹理取样、边缘和局部对比度适应计算。将四个像素的工作合并至单个线程的缺点是增加第一阶段的复杂性,优点是能够提高速度。优势可直接帮助改进同样具有低利用率问题的独立 GPU。

实施中的高效运行时数据编码

在边缘检测中,我们将边缘候选项编码至 1 个 4 比特每像素缓冲器,将比特用作开/关标记,以表示每个方向中是否存在某个边缘。这意味着每个 2x2 像素块只可写入 16 比特的边缘信息,从而大幅减少算法的总体内存带宽使用。

对于 8 比特非 HDR sRGB 封装颜色的中间存储,我们采用 Microsoft DirectX* 12 MiniEngine 的 R11G11B10_E4_FLOAT 编码,对于成立 HDR 颜色,我们支持标准 R11G11B10_FLOAT 编码。将其扩展至任何其他编码并无多大意义,虽然使用需要超过每颜色 32 比特的编码可提高内存带宽使用和存储要求。有关存储和使用颜色信息的小浮点格式精度分析请见 Bart Wronski 的“小浮点格式 - R11G11B10F 精度”16

紧密数据打包应用于所有其他领域,例如存储在处理形状 中所创建和解析中所消耗的混合值。所有这些例程在记录时需将源代码包含在示例代码中,可在 MSAA 或非 MSAA 表面上工作,无需任何修改。

在边缘检测时利用共享本地内存

在边缘检测时,我们将边缘信息存至共享本地内存(HLSL 中)。相比使用全局内存可提高速度,因为这有助于利用英特尔® 集成开发环境 GPU 上三级缓存的高密度共享本地内存部分。独立 GPU 也可受益于该优化。

将共享本地内存用于单个着色器通道中的合并工作

在形状处理 通道中,我们面临的一个问题是,只有少数的候选项将生成可行的 Z 形状,处理其中每一个需要相对较高的成本。该问题的症结在于,线程组中用于评估的多数线程不会生成可行的 Z 形状,将继续处于空闲状态,等待找到可行 Z 形状的几个线程完成冗长的高成本操作,包括纹理读取、混合及存储操作。为缓解硬件线程的低利用率问题,我们会像以前一样测量可行的 Z 形状,然后将进一步混合与处理操作划分为单个每像素微工作项目,并将参数编码至 SLM 内存。在组障碍和组同步后,我们会将这些工作项目重新至组中的所有线程,对它们进行并行执行。详情请参考源代码中的 CMAA2_COLLECT_EXPAND_BLEND_ITEMS 宏。

与 MSAA 的互操作性

用户可在 MSAA 解析后尝试应用后期处理 AA,但该方法不适用于已使用 MSAA 进行抗锯齿的领域,因为边缘检测和启发法不再具有原始值,无法正确推断出光栅化伪影。

面向 SMAA+2xMSAA 模式(SMAA S2x)的 SMAA 11介绍了后期处理 AA 与 MSAA 的更高级集成,在该模式中,在 MSAA 解析前将效果应用于每示例平面会造成不必要的模糊。这是因为每个 MSAA 示例平面的光栅化会被有效抵消,以提取子像素信息,因此,后期处理 AA 技术根据所生成图像生成的底层几何结构假设将进行转移,导致偏离实际几何结构和明显的模糊效果。为解决这一问题,SMAA S2x 根据 MSAA 示例平面偏移使用专门偏移二次矢量化启发法(详见11 第 4.3 章子像素渲染),以解决光栅化模糊问题,实现清晰的几何结构抗锯齿。然而,它确实在像素阴影产生的非光栅化锯齿伪影上导致额外的模糊,因为在 MSAA 期间,像素阴影是按像素进行的,并且在像素中心处没有偏移,所以在这种情况下,启发法实际上导致锐度的降低。

最初我们尝试将光栅化锯齿伪影与 MSAA 表面的像素着色锯齿伪影进行分离,假定像素中的前者具有不同的示例值,后来像素中的 MSAA 示例是相同的。这在质量方面被证明是一个比较好的启发法,但复杂性会影响实际性能。

因此,我们决定恢复到简单的 CMAA2+MSAA 每示例平面方法,选择性降低 CMAA2 效果以减少模糊。有趣的是,虽然模糊度的轻微增加是明显的,我们仍然可以在 2X、4X 和 8X MSAA 场景中得到更接近地面真值参考的高质量结果(参见第 5 章的章节:CMAA2 与 MSAA 的集成),并且 CMAA2+4XMSAA 相比 8xMSAA 可实现更高的质量。这可能是因为与 SMAA 相比,CMAA2 拥有更高的总体锐度和更传统的二次矢量化。从性能的角度来看,避免偏移的二次矢量化允许我们处理相同的示例,从而产生可接受的总体成本。

然而,我们想强调的是,CMAA2 和 MSAA 的集成可以作为参考,并且未来还有许多潜在优化等待我们探索。

支持在先前计算的日志亮度纹理中实施边缘检测

边缘检测可选择在每像素 8 比特 (bpp) 预计算日志亮度纹理进行,以将第一通道中的内存带宽降低 4 倍,同时确保边缘检测质量略微下降。该方法最适合以下情况:以前的阶段可能已经产生了这样的图像,而且我们能够重新使用纹理。

第 1 阶段,共 3 个节段:边缘检测

边缘检测对具有用户可配置大小的像素数据块进行操作,每个像素数据块输出边缘数据和抗锯齿形状候选项它完成包含在所提供的着色器源代码的 EdgesColor2x2CS 函数中。我们经验发现,所有测试硬件上的最佳处理块大小是 32×32 像素。这导致每个块有效地处理 28×28 像素,因为内核的 2 个宽边界用于向内核提供近邻数据,但本身无法产生有效的输出。

检测边缘的算法是什么?

边缘检测在 sRGB(非线性)色彩空间中实施,以更好地检测人类视觉系统更可能观察到的场景边缘。对于每个像素,我们使用右侧和下方的像素确定色差是否超过特定阈值,如果是,我们将其列为需后续评估的 候选边缘。较低的阈值将覆盖更多的锯齿情况,但会增加总的执行时间,因为这会导致更多边缘被认为需要过滤。这个差异被测量为当前所考虑像素的右侧和底部像素之间的颜色通道的最大差异。在更高性能的实施方案中,我们只测量预先计算的亮度值之间的差异。我们将这些差值存储在共享本地内存(DirectX 中)以供后续处理。

边缘检测的 RGB 与亮度

边缘检测使用 RGB 数值创建亮度近似值 [Wiki 2018]。我们直接使用 RGB 进行试验;然而,事实证明,当质量损失处于最小水平时,亮度会更高。作为所提供的 RGB 与亮度近似方案的替代选项,我们还实施使用亮度示意图的可选边缘检测,该图可能已经为渲染流水线中的其他阶段创建,例如色调映射后处理。至于在特定用例中哪种方法最有效,将由用户决定。

欧氏距离指标

示例码还包括用于提高边缘检测质量的可选加权欧氏距离指标。我们的实验没有显示出显著的质量改善,因而性能成本的增加缺乏合理性。

局部对比度适应

为了避免较小的颜色不连续性与较明显的颜色不连续性一样受到重视,我们在边缘候选检测的第二部分应用了局部对比度适应 (LCA)步骤,以便在当邻域存在大量对比度更高的边缘时剔除较差的边缘。在类似于 SMAA 的技术中(如第 4.1 章边缘检测 – 局部对比度适应11所述),我们将对已经计算的颜色或亮度差降低一个幅度,即表示相反方向的连接边缘的四个值的最大值,乘以用户可选择的对比度适应乘数,如图 13 所示。更多详情请参考着色器代码中的 ComputeLocalContrastVComputeLocalContrastH 函数。我们使用共享本地内存确保计算完全在 GPU 内存中进行。

Local contrast adaptation
图 13.局部对比度适应通过相反方向的 4 个红色连接边缘值来抑制蓝色边缘值。

最后,如果剩余值高于阈值,则认为边缘存在,我们将其作为边缘的二进制标记进行存储。

输出

边缘检测的最后部分包括 2 个阶段。一是合并边缘信息,确保每个像素的处理位置保持完整的标记值,以表明存在朝向每个近邻的边缘。这个 4 位数值存储在 2D 纹理中,我们将其称为边缘工作缓冲器。在第二阶段,该信息用于识别位置是否可作为简单或复杂锯齿形状的起点,如果是,它会存储在我们称之为形状候选项列表的全局列表中,以供后续处理。

第 2 阶段,共 3 个节段:处理候选边缘

在第二个阶段,我们处理在第 1 阶段中识别的位置,并将结果存储在形状候选列表中。我们使用 GPU 18上的间接调度为每个候选形状生成一个 ProcessCandidatesCS 实例,并使用以下步骤处理每个实例:

  1. 对于每个位置,我们通过从边缘 工作缓冲器进行读取,获得该位置和四个相邻位置的边缘检测结果。
  2. 然后,我们基于先前获得的边缘信息实施简单形状分类和混合值计算,具体来说,我们使用像素和近邻之间的四个边缘以及其他的 8 个连接边缘,如图 14 所示。更多详情请参考着色器代码中的 ComputeSimpleShapeBlendValues 函数。

    Simple shape kernel size
    图 14.简单形状内核大小;12 个边缘用于形状分类(显示为红色)

    如果从步骤 2 得到的分类需要颜色混合,则在像素和它的四个近邻之间执行,并且使用着色器代码中的 StoreColorSample 函数将最终颜色值存储在单独的列表中,以便在最后阶段进行处理。

  3. 接下来,在处理这些简单形状之后,我们确定这是否可以是复杂形状(也称为对称 Z 形状)的起始位置,如上图 7 所示。我们使用着色器代码中的 DetectZsHorizontal 函数计算四个 90 度方向中每个方向开始 Z 形状的位置的基础适应分数,其中垂直的两个使用具有旋转输入的相同函数实施。评分算法基于将已加载边缘信息作为输入的启发法,支持在下一步之前提前退出。它还可区分更可能成为有效的三角形光栅化步骤的起始点,和纹理、文本或类似内容一部分的起始点。在当前的实施方案中,我们选择具有最高得分的 Z 形状,这也意味着我们只考虑来自单个位置的一个形状,即使更多形状在可能的考虑范围内。我们这样做是因为考虑多个形状的质量效益最小,但性能因素很重要。
  4. 如果上一步的 Z 形状适应分数为零或以下,我们可退出该线程。否则,我们通过跟踪每一侧的完整边缘来测量整个 Z 形状的长度,如果一个边缘变得比另一个边缘长很多,则停止,最大差值比为用户常数,默认为 1.5。如图 15 所示,其中点 Ls 和 Rs 表示跟踪开始的位置,而 Le 和 Re 表示跟踪结束的位置。在这个示例中,当边缘被破坏时,左边的跟踪停止,而右边的跟踪也会结束,因为在右边的跟踪线的长度(13 个像素)变成左边长度(9 个像素)的 1.5 倍。然后,最终长度需减去前一步的适应分数,我们的经验表明这有助于保持锐度。

    Z-shape arm lengths
    图 15.跟踪边缘以确定 Z 形状臂长

  5. 如果前一步的跟踪 Z 形状臂的总长度小于当前设置为 5.0 的常数值,则认为形状不适合并退出。否则,我们将继续假定底层几何结构的边缘跨越跟踪线的几何中心(Z 形状臂的中心),Zl = 0.5 * (Ls + Le) 及 Zr = 0.5 * (Rs + Re),如图 16 所示。

    Anti-aliasing based on the Z-shape
    图 16.根据 Z 形状应用抗锯齿

    然后,我们观察假设的几何边缘覆盖每个像素的区域,以便我们能够确定欠表示的量:Zl、Zc 和 Ls 定义了 Z 形状左侧表示不足的三角形;同样,Zr、Zc 和 Rs 定义右侧的三角形。然后,我们通过假设丢失的颜色信息的最佳表示方法是对跟踪线的下方数值(左侧)或上方数值(右侧)进行取样,以及将线上的每个像素的颜色值与它混合(比率对应表示不足三角形覆盖的像素区域),纠正表示不足的问题。该流程(如图 16 中的红色箭头所示)为 CMAA2 提供了大部分抗锯齿效应。我们通过使用带有额外标记(表示这些值来自于复杂形状(Z 形状))的 StoreColorSample 函数,以存储处理简单形状时所获得颜色值的方式存储来自前一步骤的颜色值,以便最后阶段对二者进行区分。

第 3 阶段,共 3 个节段:解析

前面的阶段使用 StoreColorSample 函数将需要存储的抗锯齿颜色值写入最终输入/输出颜色缓冲器。考虑到这些颜色值的输出像素位置有时可以在不同的复杂形状之间以及简单形状和复杂形状之间重叠,并且处理以非确定性顺序在 GPU 上并行进行,我们将它们存储在单独的每像素列表中,并对其一起处理以确保确定性。每个像素的最终颜色值被计算为加权平均数,与来自简单形状的值相比,来自复杂形状处理的值具有 10 倍的权重,这是确保上述更优质启发法具有优先级的简单方法。最后,最终颜色值写入输入/输出颜色缓冲器。

与 CMAA2 和 MSAA 的互操作性详情

CMAA2 的一项重大升级是其与 MSAA 的互操作性。一个明显可行的方法是逐一应用通道。虽然这将正确地解决大多数非光栅化的锯齿源,因为这些源不受 MSAA 的影响,但是由于边缘检测和其他启发法不再处理原始颜色值,所以在已经由 MSAA 抗锯齿的区域中,它不会做得很好。请参见图 17 中的示例。

Table leg showing geometric aliasing
图 17.桌腿的放大图像显示几何与基于着色器的锯齿。几何锯齿沿桌腿分布,阴影表示基于着色器的锯齿。左上:无 AA;右上:4xMSAA;左下:依序应用 4xMSAA+CMAA2(明显可行的方法);右下:每个平面应用 4xMSAA+CMAA2(看上去更合适的方法)

我们并未应用两个单独通道中的技术,而是在解析阶段之前将 CMAA2 应用于单个 MSAA 平面,且未考虑“第 4 章:与 MSAA 的互操作性”所述的 MSAA 示例偏移。通过这种方式,光栅化梯度的抗锯齿得到了增强,能够将模糊量保持在可接受水平,并且阴影锯齿伪影的解决方式与没有使用 MSAA 时一样,不会增加模糊量。

与 CMAA2 和 MSAA 的色调映射

有关 MSAA 表面的另一个问题是色调映射,它通常应用非线性颜色变换。结果,在使用硬件解析时,高对比度区域中的 MSAA 效应显著下降。大多数使用 MSAA 的现代图形引擎将执行自定义步骤,在色调映射[Persson 2008]之后解析 MSAA 示例,或者执行反向亮度加权混合。对于具有 MSAA 的 CMAA2,我们截取定制的色调后映射解析,以在针对已解析颜色缓冲器的定期输出之外,将针对每个示例映射的色调(不是在多次取样解析之后)额外输出到 2D 纹理阵列或其他多示例纹理中。如果未实施色调映射,该步骤可跳过。我们还在色调映射期间或单独创建一个复杂性示意图纹理,其相当于 GL_EXT_shader_samples_identical OpenGL 扩展20

具有 MSAA 的 CMAA2 的优化

不是简单地将 CMAA2 分别应用到每个多示例 (MS) 平面上然后进行解析,而是扩展三个 CMAA2 计算着色器通道中的每一个来支持 MS 表面的处理,在未解析的 MS 颜色缓冲器上操作作为输入,在解析的颜色缓冲器上作为输出运行,使用复杂度图中的信息避免对相同示例进行重复工作。

边缘检测的第一部分可以跳过颜色的后续加载,在通过复杂度图将文本及其右邻和底邻分类为所有具有相同样本的情况下,计算强度值并将强度值存储到共享本地存储器。这是在原型中实现的,并且在我们的测试中,CMAA2+4XMSAA 场景的执行节省为 30-40%。

然而,对于 CMAA2+MSAA 代码的未来优化,存在许多潜在的机会,例如通过 API 访问 GL_EXT_shader_samples_identical 类信息以避免手动计算,以及能够有效地将色调映射应用于未解析的 MSAA 颜色纹理,两者都是为了避免复制数值到中间纹理阵列,以及支持使用更高效的硬件 MSAA 解析。

边缘检测的验证

为改进可用性和验证,我们实施了调试绘图模式。这有助于我们查看边缘检测阶段检测到的边缘。在实践中,该模式还用于调节边缘检测阈值,可通过在边缘检测后调用 DebugDrawEdgesCS 进行启用,如示例代码所示。

性能和质量

尽管简单集成和对特定场景的适应性非常重要,后期处理抗锯齿 (AA) 技术的选择将主要取决于质量和性能。我们为示例提供完整的 DirectX 11 源代码,除了测试 3D 场景之外,它还能够加载任何用户图像并应用 CMAA2、FXAA 和 SMAA,以便测试性能和质量,以及找到最佳设置。我们还根据 Amazon Lumberyard Bistro 场景(来自 Open Research Content Archive)进行了分析。场景几何的内部部分没有重要修改,但是为了将资产保持在实际大小之内,使用基于块的压缩 (BC) 缩小并压缩纹理,并且删除场景外部几何结构的一些部分。纹理分辨率的降低在一定程度上降低了场景的锐度和细节性,但是场景仍然代表平均实时图形工作负载,在 250 MB 以下是容易访问的,并且可以在低端硬件上运行。

F X A A, S M A A and C M A A 2
图 18.从左至右:源、FXAA、SMAA 和 CMAA2。

我们使用的 FXAA 方案来自12进行的修改只为了使用最佳的收集纹理取样代码路径消耗单个通道 R8 纹理的输入亮度。我们使用默认的边缘阈值和质量设置,fxaaQualitySubpix 除外,其从默认值 0.75 调节至 0.55,以提高清晰度,提供最出色的峰值信噪比 (PSNR),而非地面真值参考数字,且不会影响性能。未来,我们还计划集成 Microsoft21 的计算着色器 FXAA,因为计算着色器更适合现代引擎。

对于 SMAA,我们使用Github* 中的实施方案 - 已升级至 DirectX 11,采用默认设置,无需修改。我们并不知道哪个公开计算着色器可用,若有,我们会更新代码。

质量

目视检查表明,CMAA2 和 SMAA 一般会产生一个清晰的图像,同时纹理和文本也会有所退化,除了合成测试中大部分失败的情况外,差别很小。FXAA 在所有场景中都更为模糊,即便在使用 fxaaQualitySubpixreduced 和降低 AA 质量的情况下。在保持输入图像和减少锯齿伪影处理方面,CMAA2 Extra Sharp 模式显然是最佳选择。在抗锯齿质量方面,CMAA2 和 SMAA 可提供整洁悦目的结果,SMAA 在处理对角线方面表现最佳。FXAA 可提供流畅的抗锯齿效果,但会造成锐度损失,其程度在一些场景中较为明显,在一些场景中则可以接受。

在数值分析方面,我们使用 Amazon Lumberyard Bistro 场景。我们将图像差异与 8xMSAA 参考、超级取样参考和原始源图像进行了比较。超级取样参考具有每像素 36 个 tap,每个 tap 使用 8x MSAA。下面的数字表示 8 个不同测试场景位置中计算的 PSNR 差值平均数(分辨率为 1920x1080,使用 Nvidia GeForce* GTX 1070)。这可能并未完全反映您的游戏、工作室或工作负载。这是我们提供一种可用于在任何输入图像上进行效果应用的工作实施方案的原因之一。

AA 技术PSNR (db) 比较
 SS 参考来源(无 AA)
无/td>35.28
FXAA36.75FXAA
CMAA2 ES36.63CMAA2 ES
CMAA236.86CMAA2
SMAA36.67SMAA
2xMSAA37.852xMSAA

表1.各种 AA 技术,来自 SS 参考和来源(无 AA)的 PSNR (db)。

我们可根据表 1 中的数字得出一些结论:

  • 在所测试的后 期理 AA 方法中,CMAA2 最接近超取样参考值 (36.86),紧随其后的是 FXAA (36.75)、SMAA (36.67) 和 CMAA2 Extra Sharp 模式(36.63),它们之间的差异相对较小且与上下文相关。作为参考,在 PSNR 对数尺度上,相对于非 AA 源图像(35.28)的这些改进大约是 2xMSAA 提供的改进(37.85)的60%。
  • 如果我们关注于每种方法对源图像的图像变化量,我们注意到 CMAA2 Extra Sharp 模式引起的变化最小(42.61),其次是 CMAA2(40.82)、SMAA(39.31)和 FXAA(37.84)。

我们的结论是,当测量超取样参考的差值时,所有三种技术都提供了类似的 PSNR 结果,但是 CMAA2 和 CMAA2 Extra Sharp 模式以最小的源图像变化量实现这一点,从而保留了原始图像的大部分细节,而 FXAA 导致了最显著的变化量(最明显的过度模糊糊)。

应当注意,超取样参考较小的 PSNR 差异不一定意味着图像的锯齿效果看上去比较少。例如,后期处理 AA 技术可以(并且将)对底层几何作出不正确的假设,并且执行偏离地面真值但仍悦目的重建。这仍然是净增益,平衡取决于输入内容和视觉需求。这就是我们添加 Extra Sharp 模式的原因 - 我们更喜欢默认 CMAA2 的外观,因为它比 Extra Sharp 模式具有更少的锯齿,但是在某些情况下,后者更受欢迎。对于 SMAA 和 FXAA,可以得出相同的观点;有些情况下,SMAA 处理对角线和其他高端特征可以产生更好的外观效果,有些情况下,FXAA 的锐度损失是可以接受的,甚至可取的,例如光线跟踪阴影的抗锯齿,如混合光线跟踪阴影。4

性能

我们通过对 Amazon Lumberyard* Bistro 场景的确定性 4800 帧进行定时来测量性能,其中每个 AA 技术的性能成本定义为启用它的全部运行的增量(与没有抗锯齿的基线相比)。这给出了每帧每种技术的平均增加的性能成本。我们重复该过程并计算出 4 次运行的平均值。该测试可适应代码示例“运行性能指标评测”选项实施 1

增加的 AA 技术性能成本,平均超过 4800 帧,毫秒

 

Nvidia GeForce* GTX 1080AMD Vega 64英特尔® NUC 套件 NUC8i7HVK英特尔® NUC 套件 NUC6i7KYK
1920x10803840x 21601920x10803840x 21601920x10803840x 21601920x1080
FXAA0.110.370.090.300.240.820.94
CMAA20.150.380.100.240.220.590.73
SMAA0.300.980.230.800.642.122.20

1 平台配置:Nvidia GeForce* GTX 1080:Windows® 10 64 位 Build 16299,英特尔® 酷睿™ i7-6950 处理器 @ 3.0Ghz,16384MB RAM,Nvidia Geforce GTX 1080,16221 MB 显示内存,驱动程序版本 23.31.13.9135,系统制造商和型号:MSI MS-7885.AMD Vega 64:Windows 10 64 位 Build 16299,英特尔酷睿 i7-6950 处理器 @ 3.0Ghz,16384MB RAM,AMD Radeon RX Vega,16264MB MB 显示内存,驱动程序版本 23.20.15033.5003。系统制造商和型号:MSI MS-7885.英特尔® NUC 套件 NUC8i7HVK:Windows 10 Pro-64 位英特尔酷睿 i7-6950 处理器 @ 3.0Ghz,16384MB RAM,AMD Radeon Vega M GH 显卡,8277 MB 显示内存,驱动程序版本 23.20.16.4973。英特尔® NUC 套件 NUC6i7HVK:Windows 10 64 位 Build 16299,英特尔酷睿 i7-6950 处理器@ 3.0Ghz,16384 MB RAM,锐炬® Pro 显卡 580,8264 MB 显示内存,驱动程序版本:23.20.16.9999.白皮书中提供了源代码链接。性能基于当前的工程设计估计数字,可随时更改。

表 2.FXAA、CMAA2 和 SMAA 性能在 Amazon Lumberyard Bistro 场景测量得出,采用多个 1080p 和 4k 分辨率 GPU

数字显示,分辨率较低时 CMAA2 相比 FXAA 速度略慢,当分辨率提高时速度可达到同等或更高水平,具体取决于硬件。SMAA 的成本相当于 FXAA 和 CMAA2 的大约 3 倍,根据具体内存会有较大变化(2-4 倍),该结论与“Decima 引擎:灯光与 AA 的进步”演示稿20 的发现结果及用户决定使用 FXAA 的原因相似。

值得注意的是,所有 3 个方法的多项设置可用于对性能和质量进行一定程度的平衡。

CMAA2 与 MSAA 的集成

最后,我们来看看 CMAA2 与 MSAA 的集成。关于质量,它通过有效地减少非几何锯齿(例如未充分过滤的阴影图或任何其他着色器锯齿)以及增强几何的抗锯齿(如图17所示),为完全依赖 MSAA 的开发人员提供了额外选项。

Shadows to demonstrate shader aliasing
图 19.左上:无 AA;右上:仅 CMAA2;左下:仅 4xMSAA;右下:4xMSAA+CMAA2。该场景使用了夸张的阴影表示着色器锯齿,不会用于数值分析。

略微的不足是会造成锐度损失,如 Jimenez 的“SMAA:增强型子像素形态反锯齿”所述。12 然而,图像分析(表格、SS 列 PSNR)显示,在我们的场景中,应用 CMAA per-MSAA 平面的优势可一直延伸至 8xMSAA,相比仅使用 8xMSAA,4xMSAA+CMAA2 更接近地面真值。

AA 技术SS PSNR增加的成本,毫秒
Nvidia GeForce* GTX 1080, 4kAMD Vega 64, 4k英特尔® NUC 套件 NUC6i7KYK,1080p
无/td>35.28   
CMAA236.860.370.240.73
2xMSAA37.851.121.235.44
2xMSAA+CMAA238.492.251.988.67
4xMSAA39.232.482.6310.77
4xMSAA+CMAA239.814.433.9216.61
8xMSAA39.754.096.8622.86
8xMSAA+CMAA240.117.699.2433.96

表3.MSAA 和 CMAA2 组合 – 质量与性能概述

CMAA2 与 MSAA 的当前集成是一种初步方案,但在一些硬件上仍然具有应有的作用,如 AMD Vega 64 和英特尔® NUC 套件 NUC6i7KYK,其中 4xMSAA+CMAA2 相比 8xMSAA 更接近地面真值参考且更快。对于 Nvidia GTX 1080,情况就不太确定,因为 MSAA 开支相应地有所下降。

需要注意的是,当前的 MSAA+CMAA2 实施方案并未发掘所有的潜在优势,无法有效避免单独处理像素上所有相同的 MSAA 示例。反之,该信息可手动提取,并存储在一个单独的纹理中以供后续在 CMAA2 通道中使用。然而,在大多数的图形硬件上,该信息已经存在,而某些情况会尝试展示这些信息,例如:EXT_shader_samples_identical.效率低下的另一个重要原因是需要通过 Texture2DArray 方法在色调映射之后导出 MSAA 表面样本。相反,如果我们能够运对 MSAA 表面应用色调映射,然后直接读取它,我们可以明显地降低集成费用,所有这些目前进行了测量,如表 2 的增加的性能成本所示。

总结和未来工作

总之,我们已经描述了使用计算着色器模型 5.0 显著改进的 CMAA,并提供了性能和质量测试结果。我们已经表明,它可以用来提供良好的抗锯齿,同时以相对较低的性能成本保持原始图像的锐度,使其适用于独立 GPU 之外的集成和移动 GPU 解决方案。未来,我们计划实施或探索各种增强特性:

  • 增加对 16 位浮点数学的支持,并评估潜在的性能提升。
  • Pixar* 的 Matthew Williams 建议,我们还应该评估旋转图像 45 度,以便处理对角线边缘候选项。我们认为这是个好建议,并将进行进一步研究。
  • DirectX 12 和 Vulkan* API 端口。
  • 关于与 MSAA 的集成,存在许多优化性能的机会,例如基于复杂度图的附加的每个文本而不是每个样本处理,以及更好地利用现有的 MS 表面信息。
  • 我们希望添加一个功能来禁用示例中的纹理,这样抗锯齿对几何伪影的影响可以独立于任何阴影伪影进行评估。

使用 DirectX* 中的 CMAA2 和计算着色器 5.0 示例

有关构建和运行工作 DirectX11 示例的说明,请参见GitHub*。我们还有一个集成到 Microsoft DirectX 12 Mini-Engine 中的实现,用于与 FXAA 进行比较,并确保计算着色器 5.0 实现在两个版本的 DirectX API 中都能正常工作。计算着色器 5.0 的结构应该比较容易集成,但是我们欢迎改进示例代码的建议或努力。在主机端,需要创建和传递上一节中提到的附加缓冲器以及 CPU 端示例代码中所示的缓冲器。

致谢

我们想对支持本工作的多人表达由衷感谢。首先感谢 Leigh Davies 和 Axel Mamode,感谢他们带来的灵感和在实现原始 CMAA 方面的帮助。其次,感谢 VPG 解决方案团队的 Anupreet Kalra、Sungye Kim、Javier Martinez 等成员,感谢他们鼓励我们再次审查原始 CMAA。然后,感谢 Mike Burrows、Josh Doss、Stephen Junkins 等团队成员,感谢他们支持我们解决各种技术问题,让我们有时间实现新的结果。最后,我们要感谢 Alexander Reshetov 先前的工作,帮助开辟了 AA 技术的全新领域,并感谢 Jorge Jimenez 和 Timothy Lottes 先前的工作,他们让这些技术在实时图形领域得到了普及。

参考

  1. Filip Strugar:传统形态抗锯齿 (CMAA) – 2014 年 3 月更新。2014 年 3 月 18 日。
  2. Alexander Reshetov:形态抗锯齿。2009 年高性能显卡。
  3. Jorge Jimenez 面向 SMAA 的 GitHub* 库。
  4. John Story:混合光线跟踪阴影。GDC 2015
  5. Sungye Kim:时间稳定传统形态抗锯齿 (TSCMAA)
  6. Alexander Reshetov,Jorge Jimenez:2009 年到 2017 年的 MLAA 演进:研究影响回顾。2017 年高性能显卡。
  7. Nicolas Schulz,Moiz Ahamed S:CRYENGINE 抗锯齿。2017 年 9 月 29。
  8. Jorge Jimenez,Belen Masia,Jose I. Echevarria,Fernando Navarro,Diego Gutierrez:实用形态抗锯齿。GPU Pro 2,编辑:Wolfgang Engel,第 95-113 页,AK Peters,2011 年。
  9. Timothy Lottes:FXAA。2009 年 2 月。
  10. Timothy Lottes:实时抗锯齿的过滤方法。SIGGRAPH 2011
  11. Jorge Jimenez,Jose I. Echevarria,Tiago Sousa,Diego Gutierrez。SMAA:增强的子像素形态抗锯齿。Eurographics 2012,P. Cignoni,T. Ertl 客座编辑,第 2 期第 31 卷 (2012)。
  12. Codemasters*
  13. Microsoft MSDN 文档:ID3D11DeviceContext::DispatchIndirect method
  14. Emil Persson:关于 ShaderX6 的《D3D10 中面向高质量 HDR 抗锯齿的后色调映射解析》,ShaderX6:先进的渲染技术。编辑:Wolfgang Engel。
  15. GL_EXT_shader_samples_identical
  16. Bart Wronski:小浮点格式 - R11G11B10F 精度 2017 年 4 月 2 日
  17. Simon Rodriguez 面向 Nvidia FXAA 3.11 的 GitHub* 库(作者:Tim Lottes)。
  18. DirectX-Graphics 示例包括 Mini-Engine 中的 FXAA 实施方案
  19. Giliam de Carpentier (Guerrilla Games),Kohei Ishiyama (Kojima Productions):Decima Engine:Advances in Lighting and AA, Advances in Real-Time Rendering in Games。SIGGRAPH 2017。
  20. DirectX-Graphics 示例包括 Mini-Engine 中的 FXAA 实施方案

John Papadopoulos:DirectX 12 – 执行间接命令可进一步提升性能和大幅减少 CPU 使用。2015 年 3 月 6 日。

FTC 免责声明

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。

SYSmark 和 MobileMark 等性能测试使用特定的计算机系统、组件、软件、操作和功能进行测量。上述任何要素的变动都有可能导致测试结果的变化。您应当参考其它信息和性能测试以帮助您完整评估您的采购决策,包括该产品与其它产品一同使用时的性能。更多信息请访问 www.intel.cn/content/www/cn/zh/benchmarks/benchmark.html

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.