Thanks to visit codestin.com
Credit goes to github.com

Skip to content

【RFC】 Anti-Aliasing(FXAA/TAA) #2350

@hhhhkrx

Description

@hhhhkrx

现状

  • 一旦开启 HDR 或 OpaqueTexture,WebGL 1 是无法开启 MSAA 的

  • 开启了 MSAA 帧率会有明显下降,pc 端实测下来 4x 的精度会掉 6-8 帧左右

  • MSAA 主要针对几何边缘的锯齿,对于纹理叠混的时候或者 shader 镜面反射导致的锯齿是无法解决的,以及无法处理透明物体上的锯齿、AlphaTest 等贴图像素导致的锯齿

  • MSAA 是一种硬件抗锯齿方法,意味着 FXAA 可以作为 MSAA 的补充一起使用,但 TAA 不能和 MSAA 一起使用

关于 MSAA 目前的设计缺陷

  • 编辑器的 camera 下如果没有打开 Opaque TextureHDRPost Process 任意三者,但是又打开了 MSAA,导出项目 MSAA 是不生效的,只有当打开了三者之一,MSAA 才是生效的

FXAA

怎么实现的?

核心思想是基于 亮度梯度检测边缘,然后在屏幕空间对单帧图像进行模糊处理

问题点

  • 需要检测边缘的哪些像素?
  • 如果场景中有多个不同的后处理 FXAA,是否会影响最终画面效果?

对比分析

特性 Filament FXAA Unity URP FXAA Babylon FXAA
HDR 支持 没有特定 HDR 处理 处理了 HDR , 通过 Tonemap 映射到 LDR 无 HDR 适配
采样策略 切线方向采样2次或4次 对角方向模糊采样4次 3x3 边缘方向采样
调控参数 多,锐度、阈值等细调(fxaaConsoleEdgeSharpness/fxaaConsoleEdgeThreshold等) 固定参数(FXAA_SPAN_MAX/FXAA_REDUCE_MUL等) 适中,阈值和像素质量(fxaaQualitySubpix等)
平台优化 主机平台优化(ps3/xbox等) 跨平台兼容,规避WebGL1不支持 texture.Load() 的问题 更适配Web平台,考虑了WebGL 2、WebGPU

设计与考量

FXAA Engine

1. FXAA 在后处理链路中的位置:

  • FXAA 放到 FinalPost ,UberPost 不执行抗锯齿
Pass 主要作用 处理空间
UberPost Bloom、Tone Mapping 等 HDR
FinalPost FXAA、Dithering 等 LDR(最终屏幕输出)

2. HDR 兼容:

  • FXAA 本身对 HDR 和 LDR 没有强依赖,开启 HDR 后像素颜色范围大于 1,需要映射到 LDR 计算 FXAA,处理完 FXAA 再乘回来

3. 边缘像素检测:

  • 基于邻近像素计算亮度对比,只计算对角(左上/左下/右上/右下)四个像素

FXAA Editor

  • camera 下新建一个 Rendering 分组,统一把渲染相关的配置放到这里,抗锯齿位于 Rendering 下的 Anti-Aliasing ,只提供:启用/禁用 FXAA,默认 No Anti-aliasing ,不暴露相关参数给用户,因为 FXAA 本身没有太高的消耗,如果需要高质量的AA,后续可以考虑增加同样基于边缘检测的 SMAA

参考

TAA

作用:利用历史帧的信息来平滑当前帧的锯齿,消除时间帧之间的闪烁和锯齿

设计与考量

Engine

  • 执行时机:放在 UberPost 之前,避免影响 HDR
  • 需要的数据:
    • TaaMotionVectorTexture:存储运动矢量的纹理(每个像素相对上一帧的运动),这张纹理需要基于 motionVectors 获取
    • TaaAccumulationTexture:存储 TAA 历史累积的颜色信息
  • 不能和 camera stack/MSAA 一起使用,因为 TAA 依赖历史帧,而 Camera Stacking 改变了渲染顺序

motionVectors 是什么?

  1. Object Vector : 来自物体本身的 Skinned Mesh 或 Animator
  2. Camera Vector : 记录摄像机移动的向量,Unity 会将摄像机的运动影响到所有像素

最终 motionVectors 结果叠加二者

为什么会鬼影?

  • 静态物体默认不会写入 Motion Vectors
  • 如果启用 TAA,但未生成 Motion Vectors,Unity 会假定像素未移动,所以导致鬼影

Editor

  • 放到 Anti-Aliasing 下,命名 :Temporal Anti-aliasing,可选择 QualityVery High / High / Medium / Low / Very Low

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions