← ALL ARTICLES

抗锯齿与时域重建

全库目录221
本文目录28

锯齿不是只发生在三角形边缘。几何覆盖、纹理、高光、阴影和透明测试都会产生高频信号。不同抗锯齿方法处理的信息不同。

时域抗锯齿(Temporal Antialiasing,TAA)通过跨帧复用样本近似更密集的空间采样。它要解决的仍是空间锯齿,手段是把每像素多个采样点分摊到连续多帧,用时间换取采样数。

样本累积解释静止画面的收敛,历史校验处理运动、遮挡与着色变化。时域采样与重投影说明采样和坐标,时域历史校验说明历史取舍。本页比较空间方案、成本与引擎接入。

空间采样方案

超采样(SSAA)

用更高分辨率渲染,再过滤到目标分辨率。它同时改善几何、纹理和 Shader 锯齿,接近最直接的参考方案。

更高分辨率通常增加片元、附件和带宽成本,几何处理不一定同比增加。它常用于对照图;是否全程采用取决于预算。

MSAA

MSAA 在每个像素保存多个 Coverage/Depth 样本,但通常只执行一次 Pixel Shader,再把结果写到覆盖样本。

它擅长处理三角形边缘,因为同一像素内多个样本可以表示部分覆盖。

它不能自动解决:

  • Shader 内部的程序化硬边;
  • 高频法线和高光;
  • 纹理缩小;
  • 没有使用 Alpha-to-Coverage 的 Alpha Test 边缘;
  • 时域闪烁。

Deferred Rendering 使用多个 GBuffer 时,MSAA 会增加存储和解析复杂度,因此很多引擎改用时域方案。

Sample Frequency 和 Resolve

MSAA 的 Coverage 和 Depth 按样本保存,Pixel Shader 默认可以按像素频率运行。三角形边缘的多个样本可能属于不同 Primitive,此时实现会根据覆盖拆分调用,或让 Shader 按样本频率执行。centroid 插值可避免插值位置落在当前 Primitive 覆盖之外。

Resolve 把多样本颜色转换成单样本颜色。普通线性颜色通常做算术平均:

hlsl
Texture2DMS<float4, 4> MsaaColor : register(t0);

float4 Resolve4x(uint2 pixel)
{
    float4 sum = 0.0;
    [unroll]
    for (uint sampleIndex = 0; sampleIndex < 4; ++sampleIndex)
        sum += MsaaColor.Load(pixel, sampleIndex);
    return sum * 0.25;
}

实际 API 通常提供硬件 Resolve。手写代码适合需要自定义权重或检查样本值的场景。输入应该是线性颜色;在 sRGB 编码值上直接平均会得到错误亮度。

Depth、Stencil、Normal、Material ID 等数据没有统一的“平均”含义。Depth 可能按最近样本、最远样本或保留多样本形式处理,取决于反向 Z 和后续用途。Deferred 在几何边缘可能需要逐样本光照,或通过边缘检测只对复杂像素走特殊路径。

FXAA

FXAA 是单帧后处理。它根据亮度或颜色变化检测边缘,再沿边缘方向平滑。

一种可推演的单帧边缘过滤先读取中心与上下左右的亮度。若邻域最大值与最小值之差小于阈值,就保留中心;差异较大时,比较横纵方向的变化,沿估计的边缘切向搜索两端,再在边缘法向选择偏移后的颜色。搜索范围和阈值限制成本,偏移试图把阶梯边界变成连续覆盖。

例如水平黑白分界在上侧为1、下侧为0,而同一行邻居近似相等,亮度变化主要沿竖直方向,边缘切向便沿水平方向。若把方向认反而沿竖直搜索,搜索会越过边界并模糊本不相关的表面。完整FXAA还包含子像素与边缘端点启发式,本段只展开这类图像过滤的决策链,不作为对应版本源码实现。

它只有最终颜色,无法区分一条真实几何边与文字笔画;平滑同样的高对比形状时,文字也可能变软。它也没有上一帧信息,不能判定某个闪烁纹素在时间上应如何平均。性能取决于邻域读取、搜索长度与实现,不能只凭名称给固定耗时。

时域抗锯齿

详见 时域采样与重投影。

抖动

详见 时域采样与重投影。

写入投影矩阵

详见 时域采样与重投影。

序列的选择

详见 时域采样与重投影。

纹理采样偏置

详见 时域采样与重投影。

历史累积与重投影

详见 时域采样与重投影。

样本累积

详见 时域采样与重投影。

固定系数等价于指数平滑

详见 时域采样与重投影。

等效采样数

详见 时域采样与重投影。

等权重方案

详见 时域采样与重投影。

α\alpha 的下界

详见 时域采样与重投影。

在管线中的位置

详见 时域采样与重投影。

亮度自适应权重

详见 时域采样与重投影。

重投影

详见 时域采样与重投影。

运动向量

详见 时域采样与重投影。

采样邻域最近深度

详见 时域采样与重投影。

重采样滤波

详见 时域采样与重投影。

历史校验

详见 时域历史校验。

拒绝

详见 时域历史校验。

矫正

详见 时域历史校验。

颜色空间与离群值

详见 时域历史校验。

混合系数自适应

详见 时域历史校验。

一个像素的历史决策

详见 时域历史校验。

伪影的成因

详见 时域历史校验。

模糊

详见 时域历史校验。

鬼影

详见 时域历史校验。

闪烁

详见 时域历史校验。

欠采样

详见 时域历史校验。

高频细节的稳定性

详见 时域历史校验。

应对方向

详见 时域历史校验。

分辨率与着色率

详见 时域历史校验。

仅用重投影的简化方案

详见 时域采样与重投影。

时域超采样

详见 时域采样与重投影。

成本特性

TAA的重建通道通常按输出像素执行,分辨率、滤波核、历史格式及拒绝路径影响成本。运动向量生成、响应标记等前置工作还与场景有关,不能只用全屏通道时间代表集成成本。

GPU 时间需注明设备、输出分辨率、历史格式、重建核和测量方法。分辨率提高会增加采样与写入量,具体耗时以目标平台计时为准。

MSAA成本随样本数、附件布局、着色频率和几何复杂度变化。分块架构可以把部分多样本附件保留在片上,但片上容量、解析与溢出也有代价,应在相同画质目标下与时域方案比较。

时域超分还可能带来额外开销:它同时承担抗锯齿职责,必须置于部分后处理之前,导致这些后处理要在升采后的分辨率上执行。

与引擎的耦合

TAA 原理不复杂,但与渲染管线关系极深。每一项渲染功能都需要考虑它的影响:材质要提供运动向量,透明与粒子需要响应遮罩,后处理顺序要重新安排,随机化效果要配合它的积分特性。

这是集成 TAA 的主要成本,也是不同引擎实现细节差异很大的原因。

方案选择

方法处理的锯齿主要代价适用
SSAA增加空间采样可处理的来源片元、附件和采样量增长离线参考、截图
MSAA几何边缘随几何与深度复杂度变化前向渲染、移动端
FXAA图像上的边缘邻域读取与有限搜索低端兜底、叠加使用
TAA能建立可靠历史对应的多类信号重建及历史数据成本延迟渲染、桌面与主机

多重采样GBuffer增加附件与逐样本光照的组织成本,时域方案则增加运动向量、历史和重建成本。前向或延迟路径只给出候选条件,实际选型按目标设备、内容与稳定性要求比较。

这些方法并不互斥。常见组合是以时域方案为主,用空间方法处理它尚未收敛的区域。

验证方法

  • 用高对比斜边、细线与棋盘格纹理做基准,逐项开关各抗锯齿方法,确认每项解决的锯齿类型。
  • 检查 Alpha Test 与程序化硬边。常规像素频率着色下,MSAA 对这些着色内部边缘的帮助有限;Alpha-to-Coverage 和样本频率着色可改变覆盖行为,需分别验证。
  • 在 sRGB 与线性两种颜色状态下各做一次 Resolve,确认没有在编码值上直接平均。
  • 单独显示运动向量,分别验证相机运动、骨骼动画、顶点动画与 UV 动画。
  • 冻结相机只移动物体,确认向量方向与尺度正确。
  • 关闭抖动,区分空间滤波与时域累积各自的贡献。
  • 显示历史权重、拒绝遮罩与遮挡揭露区域。
  • 用移动遮挡、高亮粒子做压力测试,观察鬼影与闪烁。
  • 静止画面下观察收敛过程,确认若干帧后细节稳定增加。
  • 关闭历史矫正作诊断对照:记录闪烁与鬼影的变化,并分别检查运动向量、几何拒绝及邻域是否遗漏细节。
  • 相机瞬切后检查前几帧是否过锐带锯齿。

本机数值检查:raster_models.py 与 test_raster.py验证颜色盒裁剪的盒内、盒外和退化输入,以及两帧w不同时的UV运动量和Y轴方向,运行 python -B 知识库/examples/revision/test_raster.py。HLSL片段未构成完整TAA工程。

本机机制检查:CPU 权重展开得到5、10、15帧约2.17、5.13、9.78个等效样本,稳态约19;假设各样本独立且等方差。检查代码见 reference.py,运行 python 知识库/examples/mechanisms/reference.py。引擎画面、GPU捕获与性能另外验证。

2026-10-24,正文片段验证器从当前文章抽取Resolve4x片段,补齐显式常量、入口与采样辅助函数后通过DXC离线编译。验证器合计覆盖五个入口;深度宿主采用普通Z与点采样钳制约定,完整管线、GPU执行和画质仍需目标工程验证。

相关主题

参考资料

  • MJP,Tex2DCatmullRom:2026-10-22核读四项权重、合并中间采样的9次实现,以及作者对省略四角形成5次近似的说明;本文不引用来源设备的耗时作为本机性能。
  • Marco Salvi,An Excursion in Temporal Supersampling:2026-10-22核读第12—24页及38—45页的EMA、颜色盒、方差裁剪与运动复用;来源案例不作为本文运行结果。
  • Microsoft Rasterization Rules:MSAA覆盖、着色调用与centroid规则。
  • 等效样本数和颜色盒裁剪的具体输入输出由本库CPU实验验证;跨帧画质与性能保留目标工程验收。