01 / 一个像素中心看不见全部覆盖
如果每个像素只测试中心点,细小几何和斜边可能在相邻像素间忽隐忽现。高于采样上限的空间频率会伪装成较低频率,表现为阶梯、摩尔纹和运动闪烁。
像素颜色 ≈ 像素覆盖区域内连续图像的平均值
理想做法是在采样前用低通滤波移除无法表示的高频,但实时渲染中几何、着色和运动持续变化,只能用有限样本近似。
02 / SSAA 与 MSAA 增加空间样本
SSAA:更高分辨率完整渲染
超级采样以更高分辨率执行全部着色,再缩小到目标分辨率。它能处理几何边缘和着色器内部高频,质量直接,但片元着色、带宽和内存代价很高。
MSAA:共享片元着色结果
多重采样抗锯齿在每个像素保存多个覆盖和深度样本,但通常只执行一次片元着色,再按覆盖解析。这对几何轮廓高效,却不能解决纹理、法线或程序化着色内部的混叠。
| 方法 | 几何边缘 | 着色混叠 | 主要代价 |
|---|---|---|---|
| SSAA | 很好 | 很好 | 完整高分辨率渲染 |
| MSAA | 很好 | 有限 | 多样本深度与颜色 |
| 无抗锯齿 | 差 | 差 | 最低 |
03 / 后处理方法从最终图像寻找边缘
FXAA 根据局部亮度变化识别高对比边缘,并沿边缘方向平滑。它速度快、接入简单,对几何和着色边缘都能生效,但可能模糊文字和细节,也无法真正恢复亚像素几何。
SMAA 使用更精细的边缘模式识别和权重计算,通常比 FXAA 保留更多细节,代价也略高。此类方法只读取当前帧,不需要运动向量与历史缓冲。
后处理抗锯齿是在结果上推断原因。它看到的是已经发生混叠的图像,因此便宜、通用,但信息恢复能力有上限。
04 / TAA 把连续帧变成更多样本
时间抗锯齿每帧轻微抖动投影,让像素落在不同子像素位置;再用运动向量把上一帧结果重投影到当前帧,与当前样本累积。
historyUV = currentUV + motionVector
result = blend(currentSample, reprojectedHistory)
result = blend(currentSample, reprojectedHistory)
静止区域能随时间获得许多样本,细节和稳定性通常优于单帧方法。但遮挡关系变化、透明物、动画材质和错误运动向量会造成拖影。
- 历史颜色钳制避免旧颜色超出当前邻域范围。
- 响应式遮罩减少快速变化区域的历史权重。
- 抖动序列应覆盖均匀且避免明显周期。
- 相机切换或分辨率变化时要重置历史。
时间升采样
现代升采样技术以低分辨率渲染当前帧,再利用抖动、运动向量和历史帧重建高分辨率输出。它同时承担抗锯齿与性能优化,但更依赖稳定的输入数据。
05 / 根据内容与管线选择
| 场景需求 | 可优先考虑 | 注意事项 |
|---|---|---|
| 像素风、锐利 UI | 最近邻或局部无 AA | 避免无意模糊设计语言 |
| 前向渲染、几何边缘为主 | MSAA | 透明与着色混叠另行处理 |
| 移动设备、预算紧 | FXAA / SMAA | 关注细节损失 |
| 现代三维场景、运动稳定性 | TAA / 时间升采样 | 必须提供可靠运动向量 |
| 离线高质量 | 大量随机采样 | 计算时间换精度 |
没有万能方案。先区分混叠来源是几何覆盖、纹理缩小、镜面高频还是时间闪烁,再选择对应过滤与采样策略。