抗锯齿方法总结
游戏引擎抗锯齿方法 - MSAA、TAA、FXAA 与 DLSS
核心原理概览
下图从像素级别展示了锯齿的产生原因以及四种代表性方法的消除思路:

- 无 AA:几何边缘与像素网格不对齐,产生阶梯状锯齿。
- SSAA:每个像素内取多个采样点,混合后得到平滑边缘 —— 暴力但有效。
- TAA:每帧施加不同的亚像素抖动,累积多帧信息等效于超采样。
- DLSS / FSR 2:以低分辨率渲染,通过 AI 神经网络重建出高分辨率图像。
一、基于采样的方法
SSAA(Super-Sample Anti-Aliasing)
- 原理:以高于目标分辨率(如 2x、4x)渲染整个场景,再降采样到目标分辨率。
- 优点:质量最高,所有类型的锯齿都能消除(几何边缘、着色器锯齿、纹理锯齿)。
- 缺点:性能开销巨大,4x SSAA 意味着 4 倍的像素着色量。
- 现状:现代游戏几乎不使用,仅在离线渲染或截图模式中偶尔出现。
MSAA(Multi-Sample Anti-Aliasing)
基本原理
MSAA 的核心思想是将「覆盖测试」和「着色计算」解耦:
- SSAA 对每个子采样点都独立运行像素着色器 → 4x SSAA = 4 倍着色开销。
- MSAA 对每个像素只运行 一次 像素着色器,但在光栅化阶段为每个像素分配多个 采样点(Sample) 来做覆盖测试。
以 4x MSAA 为例,每个像素包含 4 个子采样点,每个采样点独立做覆盖测试,但着色器只在像素中心运行一次:

工作流程
MSAA 完整的渲染流程分为四个阶段 —— 覆盖测试、单次着色、写入采样点、Resolve:

为什么只对边缘有效
- 像素完全在三角形内部:4 个采样点全部被覆盖 → 颜色完全相同 → Resolve 后无变化。
- 像素完全在三角形外部:0 个采样点被覆盖 → 无影响。
- 像素在三角形边缘:部分采样点被覆盖 → Resolve 产生混合色 → 平滑过渡。

这就是 MSAA 的效率来源:着色器开销与非 MSAA 几乎相同,额外成本仅在光栅化阶段的覆盖测试和多倍的帧缓冲存储上。
存储与带宽开销
MSAA 需要多倍的渲染目标(Render Target)存储:
| 模式 | 每像素采样点 | 帧缓冲倍率 | 典型用途 |
|---|---|---|---|
| 2x MSAA | 2 | 2× | 移动端常用,开销最低 |
| 4x MSAA | 4 | 4× | 桌面端常用,性价比最佳 |
| 8x MSAA | 8 | 8× | 高端场景,边际收益递减 |
在桌面 GPU 的 即时模式渲染(Immediate Mode Rendering, IMR) 架构下,这些多倍帧缓冲存储在显存(VRAM)中,Resolve 阶段需要从显存读回所有采样点再写回 —— 带宽开销显著。
MSAA 的局限性
- 着色器锯齿(Shader Aliasing):MSAA 只对几何边缘有效。像素着色器内部产生的高频变化(如镜面高光闪烁、法线贴图导致的锯齿)不会被 MSAA 处理,因为着色器只在像素中心运行一次。
- Alpha 纹理边缘:使用 Alpha Test 的半透明纹理(植被、铁丝网)的边缘不是几何边缘,MSAA 无法直接处理。需配合 Alpha-to-Coverage 技术。
- 延迟渲染不友好:延迟渲染的 G-Buffer 通常包含 4-6 个渲染目标(法线、Albedo、金属度/粗糙度、深度等),MSAA 会使每个 G-Buffer 都膨胀为 N 倍,显存和带宽成本极高。
移动平台上 MSAA 为何近乎免费
这是 MSAA 最有趣的特性之一:在桌面 GPU 上 MSAA 有明显的带宽和存储开销,但在移动 GPU 上 4x MSAA 几乎没有性能损失。原因在于两种截然不同的 GPU 架构。
下图对比了桌面 IMR 与移动 TBR 两种架构下 MSAA 的数据流动差异:

桌面 GPU:即时模式渲染(IMR)
- 帧缓冲存储在片外显存(VRAM)中。
- 4x MSAA → 帧缓冲和深度缓冲膨胀为 4 倍。
- 每个采样点的读/写都需要走 GPU ↔ VRAM 的外部总线。
- 带宽开销是真实的,尤其在高分辨率下。
移动 GPU:基于瓦片的渲染(Tile-Based Rendering, TBR)
移动 GPU(Mali、Adreno、Apple GPU、PowerVR)采用完全不同的架构。整个瓦片处理流程中,MSAA 的采样点始终停留在片上 SRAM,从未离开芯片:

TBR 架构的关键:
- 分块处理:整个屏幕被划分为小块(Tile),每个 Tile 通常是 16×16 或 32×32 像素。
- 片上缓冲:每个 Tile 的所有渲染工作(包括所有采样点)都在 GPU 芯片内部的高速 SRAM(Tile Buffer)中完成。
- Resolve 在片上:MSAA 的 Resolve(N 个采样点 → 1 个最终颜色)直接在片上 SRAM 中完成,不需要将多倍采样点写出到系统内存。
- 写出 1×:最终只有 Resolve 后的 1× 大小的结果被写回系统内存。
为什么这使 MSAA 近乎免费
| 开销项 | 桌面 IMR | 移动 TBR |
|---|---|---|
| 帧缓冲存储 | 4× 显存占用 | 片上 SRAM 中,不占外部内存 |
| 采样点读写带宽 | 4× 带宽(走外部总线) | 片上 SRAM,带宽近乎无限 |
| Resolve 带宽 | 从显存读 4× 再写 1× | 片上完成,只写出 1× |
| 着色器开销 | 1× (不变) | 1× (不变) |
| 光栅化开销 | 略增(覆盖测试) | 略增(覆盖测试) |
唯一增加的成本是光栅化阶段每个像素多做几次覆盖测试,以及片上 SRAM 中多存几个采样点 —— 但 Tile Buffer 本身就是为此设计的,容量足够。桌面 GPU 上最大的性能杀手(带宽)在 TBR 架构中被完全消除了。
在 Vulkan / Metal 中,通过 Transient / Memoryless 渲染目标声明,可以显式告诉驱动:MSAA 的多采样附件不需要写回系统内存,Resolve 后即可丢弃。这在 API 层面确保了零额外带宽:
// Vulkan:MSAA 附件声明为 LAZILY_ALLOCATED
// 表示该附件只存在于片上 Tile Buffer 中,不分配系统内存
VkImageCreateInfo msaaAttachment = {};
msaaAttachment.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
| VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
// 内存分配使用 LAZILY_ALLOCATED_BIT
memoryAlloc.memoryTypeIndex = findMemoryType(
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT);
// Render Pass 中声明 Resolve,storeOp = DONT_CARE(不写回多采样数据)
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
resolveAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;// Metal:MSAA 纹理声明为 Memoryless
let msaaTexDesc = MTLTextureDescriptor()
msaaTexDesc.textureType = .type2DMultisample
msaaTexDesc.sampleCount = 4
msaaTexDesc.storageMode = .memoryless // 只存在于 Tile Memory 中
// Render Pass 中指定 Resolve
renderPassDesc.colorAttachments[0].texture = msaaTexture
renderPassDesc.colorAttachments[0].resolveTexture = resolveTexture
renderPassDesc.colorAttachments[0].storeAction = .multisampleResolve实际性能数据参考
在典型的移动设备上:
- 无 AA → 4x MSAA:帧时间增加通常 < 5%,有时甚至可忽略不计。
- 相比之下,TAA 在移动端需要额外的全屏 Pass(历史缓冲读写 + 运动向量),开销反而更大。
- FXAA 虽然也是单 Pass,但它的全屏后处理带宽开销在移动端同样不可忽视。
因此在移动端,MSAA 不仅画质优于 FXAA,性能开销反而更低 —— 这就是为什么 Unity 和 Unreal 在移动端前向渲染管线中默认推荐 MSAA。
- 优点:相比 SSAA 大幅降低开销,几何边缘抗锯齿效果好。
- 缺点:
- 无法处理着色器内部产生的锯齿(高光闪烁、alpha 纹理边缘等)。
- 在延迟渲染(Deferred Rendering)管线中开销较大,需要多倍 G-Buffer 存储。
- 现状:在前向渲染管线和移动端仍有广泛应用。
二、基于后处理的方法
基于后处理的抗锯齿(Post-Process AA)与前面的采样类方法有本质区别:它们不参与场景渲染本身,而是拿到已经渲染完成的最终图像(一张普通的 2D 纹理),像图像滤镜一样在屏幕空间检测锯齿并修复。因此它们:
- 完全与渲染管线解耦 —— 前向、延迟、任何管线都能用。
- 只有一张(或几张)全屏 Pass 的开销 —— 与几何复杂度无关。
- 没有任何"真实"的额外采样信息 —— 只能从最终图像里"猜"边缘在哪,本质是一种智能模糊/重建。
FXAA(Fast Approximate Anti-Aliasing)
由 NVIDIA 的 Timothy Lottes 于 2009 年提出,是最早也最广泛使用的后处理 AA。核心目标是用尽可能低的开销、单个 Pass 消除大部分可见锯齿。
工作流程
FXAA 在一个像素着色器 Pass 内完成以下步骤:
- 亮度提取:把每个像素的 RGB 转换为亮度(Luma)。通常直接用绿色通道近似,或用
dot(rgb, luma_weights)。亮度是后续所有判断的依据。 - 边缘检测:对当前像素与上下左右邻居的亮度做对比,计算局部对比度(最大亮度 − 最小亮度)。若对比度低于阈值 → 判定为平坦区域,直接跳过(早退出,省性能)。
- 判断边缘方向:通过比较水平方向和垂直方向的亮度梯度,判断这条边是偏水平还是偏垂直。
- 沿边缘搜索端点:沿着边缘方向(垂直于梯度)向两侧步进搜索,找到边缘的两个端点,估算当前像素在整条边上的相对位置。
- 计算混合系数并采样:根据相对位置算出一个偏移量,用双线性插值在边缘的垂直方向上重新采样一次,得到混合后的颜色。

优点
- 极低开销:通常 < 0.5~1ms,单 Pass,无需多重采样缓冲,显存占用几乎为零。
- 实现简单:一个片段着色器即可,可作为即插即用的后处理,任何管线都能接。
- 对所有锯齿有效:因为它处理的是最终图像,几何锯齿、着色器高光锯齿、Alpha 边缘锯齿统统都能处理(这点优于 MSAA)。
缺点
- 整体画面变模糊:它本质是有选择的模糊,会误伤本不该模糊的细节(文字、细线、纹理高频细节)。
- 亚像素细节丢失:只有一帧信息,无法恢复比一个像素更细的结构。
- 无时域稳定性:静态画面单帧看还行,但物体运动时边缘会有"蠕动/闪烁"(因为每帧独立猜测边缘,结果不连续)。
现状
作为最廉价的兜底方案仍被广泛提供,尤其在低端设备、或用户希望"零性能损失开个 AA"时。画质要求稍高的场景已被 SMAA 或 TAA 取代。
SMAA(Subpixel Morphological Anti-Aliasing)
2012 年由 Jimenez 等人提出(论文 SMAA: Enhanced Subpixel Morphological Antialiasing),是 MLAA(形态学抗锯齿)一脉的集大成者,可视为 FXAA 的高质量升级版。它不再是简单的"检测边缘 + 模糊",而是识别边缘的几何形状(morphology),再按形状精确重建。
三个 Pass
SMAA 的空间版本(SMAA 1x)由三个连续的全屏 Pass 组成:
| Pass | 名称 | 做什么 |
|---|---|---|
| ① 边缘检测 | Edge Detection | 用亮度(或颜色 / 深度)对比找出边缘像素,输出一张边缘纹理(标记每个像素的左边 / 上边是否为边缘)。带局部对比度自适应,减少误检。 |
| ② 混合权重计算 | Blending Weight Calculation | 核心步骤。沿边缘搜索其延伸长度,匹配边缘的形状模式(L / Z / U 形等),再查一张预计算的面积查找表(Area Texture) 得到每个像素的精确覆盖面积 → 混合权重。 |
| ③ 邻域混合 | Neighborhood Blending | 根据权重,对每个边缘像素与邻居做加权混合,输出最终抗锯齿图像。 |

相比 FXAA 的改进
- 模式匹配而非盲目模糊:SMAA 会分析边缘到底是什么形状,只在正确的方向、正确的范围内混合,因此模糊更少、细节保留更好。
- 预计算面积查找表:把"给定边缘形状,某像素被覆盖多大面积"这个复杂计算离线烘焙成一张纹理,运行时直接查表,兼顾质量与速度。
- 对角线处理更好:能较好还原斜线和曲线边缘,FXAA 在这类边缘容易发虚。
- 可选深度 / 颜色边缘检测:不只依赖亮度,边缘识别更鲁棒。
变体(越往下质量越高、开销越大)
- SMAA 1x:纯空间版本,上述三个 Pass。质量明显优于 FXAA,开销略高。
- SMAA T2x:加入时域(Temporal)—— 每帧亚像素抖动 + 用运动向量混合前一帧,获得接近 MSAA 的亚像素质量。
- SMAA S2x:结合 2x MSAA(Spatial multisampling),在几何边缘有真实的多采样信息。
- SMAA 4x:T2x + S2x 结合,时域 + 空间多重采样,质量最高。
优点与缺点
- 优点:画质明显优于 FXAA,模糊更少、边缘更准;1x 版本仍是纯后处理,易于集成;变体可按需在质量与性能间取舍。
- 缺点:比 FXAA 开销高(3 个 Pass + 2 张查找表纹理);空间版本(1x)仍缺乏时域稳定性,运动时不如 TAA 稳定;集成比 FXAA 复杂(需要额外的查找表资源)。
现状
在不想引入 TAA 的鬼影、又希望画质优于 FXAA 的场景中,SMAA 1x 是很受欢迎的中间选择。许多游戏同时提供 FXAA / SMAA / TAA 三档供玩家选择。
FXAA vs SMAA 对比
下图对比同一条斜边在三种处理下的效果:无 AA 呈硬阶梯锯齿;FXAA 边缘变平滑但整体对比度下降、细节发虚;SMAA 只在边缘按覆盖面积精确混合,既平滑又保持锐利:

| 维度 | FXAA | SMAA (1x) |
|---|---|---|
| Pass 数 | 1 | 3 |
| 额外资源 | 无 | 2 张预计算查找表纹理 |
| 边缘处理 | 亮度对比 + 盲目模糊 | 形态学模式匹配 + 面积查找表 |
| 画质 | 一般(偏模糊) | 较好(模糊少、细节多) |
| 对角线/曲线 | 容易发虚 | 还原较好 |
| 开销 | 极低 (<1ms) | 低(约 FXAA 的 2~3 倍) |
| 时域稳定性 | 无 | 1x 无;T2x/4x 变体有 |
| 集成难度 | 极简单 | 中等 |
三、基于时间(时域)的方法
基于时间(时域)的抗锯齿是当前的主流范式。它的核心洞察是:与其在一帧内堆砌大量采样点(昂贵),不如把采样分摊到连续的多帧里 —— 每帧只多花很少的代价,通过跨帧累积,等效地获得超采样级别的信息量。
这个思路的前提是"帧与帧之间高度相关"(相邻两帧画面变化通常很小),而挑战也正来源于此:一旦画面变化(相机/物体运动),如何正确地把上一帧的信息"搬到"当前帧,就成了成败关键。
TAA(Temporal Anti-Aliasing)
核心原理
TAA 把"超采样"在时间维度上展开。它依赖三个关键机制协同工作:
亚像素抖动(Sub-pixel Jitter):每帧对相机的投影矩阵施加一个微小的、亚像素级的偏移(通常小于 1 个像素)。这样连续 N 帧就相当于在每个像素内部的 N 个不同位置各采样了一次 —— 等效于 N× 超采样,但每帧只渲染 1×。
历史重投影(Reprojection):当前帧的每个像素,通过运动向量(Motion Vector) 找到它在上一帧中对应的位置,从历史缓冲(History Buffer)里采样出"这个表面上一帧的颜色"。
时域累积(Accumulation):把当前帧的新采样与重投影得到的历史颜色做加权混合,通常是指数移动平均:
output = lerp(history, current, α) // α 通常取 0.1 左右于是历史信息以指数衰减的方式不断累积,边缘随着帧数增加越来越平滑。
下图展示了亚像素抖动如何在多帧间累积成等效的超采样:每帧在像素内的不同位置采样一次,累积几帧后就等效于一次高倍超采样。

完整数据流
TAA 的完整数据流是一个带反馈环的结构 —— 本帧渲染与重投影后的历史经过邻域裁剪、时域混合,输出结果又成为下一帧的历史:

关键难题:Ghosting(鬼影)
时域累积最大的敌人是历史数据失效。当画面变化时,重投影可能取到错误的历史颜色,导致物体身后拖出一条"残影"。典型失效场景:
- 遮挡关系变化(Disocclusion):被遮挡的背景突然露出来,它没有有效的历史信息。
- 运动向量不准或缺失:如阴影、反射、粒子、透明物体通常不写运动向量。
- 着色随时间变化:如闪烁的高光、动画纹理,历史颜色已经"过期"。
抑制鬼影的核心技术
| 技术 | 作用 |
|---|---|
| Neighborhood Clamping / Clipping | 用当前帧该像素 3×3 邻域的颜色范围(min/max 或 AABB 包围盒)约束历史颜色,把明显越界的历史值"拉回"合理范围 —— 最重要的去鬼影手段 |
| Variance Clipping | 用邻域颜色的均值和方差构造更紧致的椭球范围来裁剪历史,比简单 AABB 更精准,减少误裁 |
| 运动向量膨胀(Dilation) | 取邻域中最靠近相机(深度最小)的运动向量,避免边缘处运动向量错位 |
| 亮度权重 / Tone-based 混合 | 按亮度调整混合权重,减少高光区域的闪烁 |
| 历史缓冲重采样 | 用 Catmull-Rom 等高质量滤波采样历史,减少重投影带来的模糊 |
抖动序列
抖动偏移通常取低差异序列(Low-Discrepancy Sequence),保证采样点在像素内分布均匀且不重复:
- Halton 序列(最常用,如 Halton(2,3))
- R2 序列、Sobol 序列
优点
- 性能开销小:每帧只多一个全屏 Pass + 一份历史缓冲,与几何复杂度无关。
- 画质高且全面:能处理所有类型的锯齿(几何、着色器高光、Alpha 边缘),静态画面质量接近 SSAA。
- 可复用抖动做其他技术:许多降噪(光追、SSAO、SSR)都能搭 TAA 的时域框架。
- 当前主流:Unity、Unreal、几乎所有现代 3A 引擎的默认方案。
缺点
- 鬼影(Ghosting):运动场景、遮挡变化时的残影,是 TAA 的标志性缺陷。
- 运动模糊 / 变糊:重投影 + 混合会损失细节,运动时尤其明显。
- 闪烁与抖动:细小高频物体(细线、栅栏)可能在帧间闪烁。
- 强依赖运动向量:没有正确运动向量的效果(透明、粒子)容易出问题。
- 低帧率下体验差:帧数越低,鬼影和延迟越明显。
TSR(Temporal Super Resolution)
定位
TSR 是 Unreal Engine 5 内置的时域上采样方案,可以看作 TAA 的进化形态:它不仅做抗锯齿,还把超分辨率(Super Resolution) 一并做了 —— 以低于目标的分辨率渲染,再用时域累积的信息重建出全分辨率图像。它是 UE5 中与 DLSS / FSR 竞争的平台无关(不依赖厂商硬件) 替代品。
TSR、DLSS、FSR 2、XeSS 都遵循同一个「低分辨率渲染 → 时域重建 → 全分辨率输出」的范式,区别只在重建算法(TSR 用增强的时域启发式,DLSS / XeSS 用神经网络):

与传统 TAA 的区别
| 维度 | 传统 TAA / TAAU | TSR |
|---|---|---|
| 主要目标 | 抗锯齿(TAAU 顺带上采样) | 抗锯齿 + 高质量超分一体化 |
| 渲染分辨率 | 通常 = 输出分辨率 | 明显低于输出(如 50%~66%) |
| 重建质量 | 上采样质量一般,易糊 | 更锐利,接近原生 |
| 历史管理 | 单一历史颜色缓冲 | 更复杂的历史管理(含亚像素置信度、更鲁棒的 rejection) |
| 硬件要求 | 通用 | 通用(Shader Model 5+,非厂商专属) |
| 平台 | 各引擎通用 | UE5 专属 |
技术特点
- 更强的历史重建:TSR 使用比传统 TAA 更精细的历史有效性判断和重投影逻辑,在低渲染分辨率下也能较好地恢复细节。
- 抗锯齿与上采样统一:省去了"先 AA 再单独上采样"的两步,质量和性能都更优。
- 性能可伸缩:通过调整屏幕百分比(Screen Percentage),可在画质与帧率间灵活权衡 —— 这也是 UE5 Nanite/Lumen 高负载下保持帧率的重要手段。
优点
- 兼顾性能提升(低分辨率渲染)与高画质(时域重建),相当于「抗锯齿 + 超分」二合一。
- 跨平台、跨硬件,不需要 RTX / 特定 GPU,主机(PS5 / Xbox)也能用。
- 与 UE5 的 Nanite、Lumen 深度集成,是官方推荐的默认方案。
缺点
- 继承了时域方法的通病:鬼影、运动模糊、闪烁,在剧烈运动时仍可见。
- 对运动向量质量要求更高(因为要在更低分辨率下重建,误差被放大)。
- 低屏幕百分比(如 50% 以下)时,细节和稳定性会明显下降。
- 目前仅限 UE5 生态。
四、基于机器学习的方法
DLSS(Deep Learning Super Sampling)— NVIDIA
- 原理:使用训练好的深度神经网络,从低分辨率渲染帧 + 运动向量 + 深度信息重建高分辨率图像。在 Tensor Core 上运行推理。
- 版本演进:
- DLSS 1.0:每个游戏单独训练模型,泛化差。
- DLSS 2.0+:通用模型,支持多种分辨率模式(Quality / Balanced / Performance / Ultra Performance)。
- DLSS 3.0:加入帧生成(Frame Generation),通过 AI 插帧提升帧率。
- DLSS 3.5:加入光线重建(Ray Reconstruction),替代传统降噪器。
- 优点:重建质量极高,甚至可能超过原生分辨率。
- 缺点:需要 NVIDIA RTX 系列硬件,闭源。
FSR(FidelityFX Super Resolution)— AMD
- 版本演进:
- FSR 1.0:纯空间上采样算法(Lanczos 变体 + 锐化),不需要运动向量,开源跨平台。
- FSR 2.0+:加入时域累积,类似 TAA + 超分辨率方案,需要运动向量和深度。
- FSR 3.0:加入帧生成功能。
- 优点:开源、跨平台、不依赖专用硬件。
- 缺点:整体质量略低于 DLSS,时域伪影处理不如 DLSS 精细。
XeSS(Xe Super Sampling)— Intel
- 原理:类似 DLSS 的机器学习超分方案,在 Intel Xe 核心上用 XMX/DP4a 指令加速。
- 优点:在 Intel Arc 显卡上有硬件加速,同时提供非 Intel 硬件的 DP4a 回退路径。
- 缺点:生态和优化程度不如 DLSS 和 FSR。
五、其他 / 专用方法
CSAA / EQAA
- MSAA 的变体,通过增加覆盖采样点(Coverage Sample)但共享颜色/深度采样点来降低显存和带宽开销。CSAA 是 NVIDIA 方案,EQAA 是 AMD 方案。
Alpha-to-Coverage(A2C)
一种利用 MSAA 的多采样点覆盖机制,来对带 Alpha 通道的半透明边缘做抗锯齿的技术。
要解决的问题
游戏里的植被、铁丝网、头发、栅栏这类物体,通常用一张带 Alpha 通道的纹理贴在一个四边形上,而不是建出真实的几何形状。渲染时有两种传统做法,各有硬伤:
| 做法 | 问题 |
|---|---|
| Alpha Blending(混合) | 需要严格的从后往前排序,半透明物体互相穿插时排序困难;且通常不写深度,容易出错 |
| Alpha Test(裁剪) | 用 clip() / discard 按阈值直接丢弃像素 —— 要么完全不透明、要么完全消失,边缘产生硬邦邦的锯齿,且 MSAA 对它无效(因为这不是几何边缘) |
Alpha Test 的边缘锯齿正是 A2C 要消除的。
核心原理
A2C 的思路是:把像素的 Alpha 值转换成 MSAA 的覆盖掩码(Coverage Mask)。
回忆 MSAA:每个像素有 N 个采样点(如 4x 有 4 个),最终颜色 = 被覆盖采样点的平均。A2C 就是让 GPU 根据 Alpha 值决定"点亮"几个采样点:
Alpha = 1.0 → 4/4 采样点覆盖 → 完全不透明
Alpha = 0.75 → 3/4 采样点覆盖 → 75% 不透明
Alpha = 0.5 → 2/4 采样点覆盖 → 50% 不透明
Alpha = 0.25 → 1/4 采样点覆盖 → 25% 不透明
Alpha = 0.0 → 0/4 采样点覆盖 → 完全透明于是在树叶纹理的边缘(Alpha 从 1 渐变到 0 的过渡带),不同像素点亮不同数量的采样点,Resolve 后就得到平滑的半透明过渡 —— 边缘抗锯齿。
关键优势
- 顺序无关(Order-Independent):因为它本质上仍是"不透明"渲染,正常写深度、走深度测试,不需要排序。这是相比 Alpha Blending 最大的优点。
- 几乎免费:它复用了 MSAA 已经存在的采样点,不需要额外的 Pass 或缓冲区。只要场景已经开了 MSAA,A2C 基本零成本。
- 能处理相互穿插:一片密集的草丛、交错的树枝,A2C 都能正确渲染,Alpha Blending 在这种场景下会排序崩溃。
局限与改进
- 采样点数量有限:4x MSAA 只有 4 级 Alpha 台阶(0/25/50/75/100%),过渡不够细腻,可能出现轻微的"抖动/噪点"感。8x 会更平滑。
- 需要固定采样模式的抖动(dithering) 来缓解台阶感,否则大面积半透明区域会显得脏。
- Unity 中的对应功能:Shader 里开启
AlphaToMask On,或在 HDRP/URP 材质里勾选 Alpha Clipping + Alpha to Coverage。 - 常见改进:结合 Alpha 锐化(把 Alpha 按 mip 距离重新归一化)解决远处 MipMap 导致植被"变淡消失"的问题。
API 层面
// D3D11:在混合状态中开启
D3D11_BLEND_DESC desc = {};
desc.AlphaToCoverageEnable = TRUE;
// OpenGL
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
// Vulkan:在 pipeline 的多重采样状态中
VkPipelineMultisampleStateCreateInfo ms = {};
ms.alphaToCoverageEnable = VK_TRUE;一句话总结:A2C 借用 MSAA 的采样点,把"透明度"翻译成"覆盖多少个采样点",从而在无需排序、几乎零开销的前提下,给植被 / 铁丝网这类 Alpha 纹理的边缘做抗锯齿。
几何抗锯齿(Geometric AA / Shader-based AA)
- 在着色器内使用
fwidth()、smoothstep()等函数手动平滑边缘,常用于:- SDF(Signed Distance Field)渲染。
- 程序化纹理 / 程序化图形。
- UI 矢量图形渲染。
超采样滤波(Texture Filtering)
- 严格来说属于纹理抗锯齿而非几何抗锯齿:
- 各向异性过滤(Anisotropic Filtering):减少倾斜角度下的纹理模糊和摩尔纹。
- Mipmap:预计算多级纹理,减少远处纹理的高频锯齿。
六、横向对比
性能开销 vs 画质
散点图直观展示各方法在「性能开销」与「画质」两个关键维度上的位置,左上角绿色区域为理想方案:

多维能力雷达图
从画质、低开销、运动表现、通用性四个维度对比六种代表方法的能力形状:

综合评分排名
将四个维度加总,用堆叠条形图展示各方法的综合得分与分项构成:

数据表格
| 方法 | 性能开销 | 画质 | 运动表现 | 适用管线 | 硬件要求 |
|---|---|---|---|---|---|
| SSAA | 极高 | 最好 | 好 | 通用 | 无 |
| MSAA | 中-高 | 好(仅几何边缘) | 好 | 前向渲染为主 | 无 |
| FXAA | 极低 | 一般(模糊) | 好 | 通用 | 无 |
| SMAA | 低 | 较好 | 好 | 通用 | 无 |
| TAA | 低-中 | 好 | 可能鬼影 | 通用 | 需要运动向量 |
| TSR | 低-中 | 好 | 可能鬼影 | UE5 | 需要运动向量 |
| DLSS | 低(含超分收益) | 很好 | 好 | 通用 | NVIDIA RTX |
| FSR 2.0+ | 低(含超分收益) | 好 | 较好 | 通用 | 无 |
| XeSS | 低(含超分收益) | 好 | 较好 | 通用 | Intel Arc 最优 |
七、技术演进时间线
从 1990 年的 SSAA 到 2022 年的 FSR 2,抗锯齿技术经历了从暴力采样到 AI 重建的演进:

八、当前主流趋势
- TAA 是当前默认基础方案:几乎所有现代引擎(Unity、Unreal、Godot)都内置 TAA 作为默认抗锯齿。
- DLSS / FSR / XeSS 是高端选择:兼具抗锯齿与超分辨率,性能收益显著,逐渐成为 AAA 游戏标配。
- MSAA 在特定领域仍有价值:移动端(OpenGL ES / Vulkan Tile-Based Rendering 对 MSAA 友好)、VR(对延迟敏感)、前向渲染管线。
- FXAA / SMAA 作为轻量备选:适合低端设备或对性能极度敏感的场景。
- 帧生成(Frame Generation)是新趋势:DLSS 3 和 FSR 3 的帧生成技术正在被更多游戏采用,但会引入额外输入延迟。
总结
- 抗锯齿方法可归为四大类:基于采样(SSAA/MSAA)、基于后处理(FXAA/SMAA)、基于时域(TAA/TSR)、基于机器学习(DLSS/FSR/XeSS),各自在画质、性能和硬件要求上做出不同权衡。
- MSAA 在前向渲染和移动端仍有不可替代的地位,TBR 架构使其在移动平台上近乎免费。
- TAA 是现代引擎的默认抗锯齿方案,通过时域累积达到接近 SSAA 的画质,但鬼影和运动模糊是其固有缺陷。
- DLSS/FSR/XeSS 等超分辨率方案代表了抗锯齿与性能优化的融合趋势,在 AAA 游戏中日益普及。
- Alpha-to-Coverage 是处理植被等半透明边缘锯齿的轻量有效手段,复用 MSAA 硬件机制实现零额外开销。
- 选择抗锯齿方法需综合考虑渲染管线、目标平台、画质要求与性能预算,没有万能的方案。
