-
-
Notifications
You must be signed in to change notification settings - Fork 384
Closed
Labels
RFCpost processingPost processingPost processingrenderingRendering related functionsRendering related functions
Milestone
Description
现状
-
一旦开启 HDR 或 OpaqueTexture,WebGL 1 是无法开启 MSAA 的
-
开启了 MSAA 帧率会有明显下降,pc 端实测下来 4x 的精度会掉 6-8 帧左右
-
MSAA 主要针对几何边缘的锯齿,对于纹理叠混的时候或者 shader 镜面反射导致的锯齿是无法解决的,以及无法处理透明物体上的锯齿、AlphaTest 等贴图像素导致的锯齿
-
MSAA 是一种硬件抗锯齿方法,意味着 FXAA 可以作为 MSAA 的补充一起使用,但 TAA 不能和 MSAA 一起使用
关于 MSAA 目前的设计缺陷
- 编辑器的
camera下如果没有打开Opaque Texture,HDR,Post 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 是什么?
- Object Vector : 来自物体本身的 Skinned Mesh 或 Animator
- Camera Vector : 记录摄像机移动的向量,Unity 会将摄像机的运动影响到所有像素
最终 motionVectors 结果叠加二者
为什么会鬼影?
- 静态物体默认不会写入 Motion Vectors
- 如果启用 TAA,但未生成 Motion Vectors,Unity 会假定像素未移动,所以导致鬼影
Editor
- 放到
Anti-Aliasing下,命名 :Temporal Anti-aliasing,可选择Quality:Very High / High / Medium / Low / Very Low
Metadata
Metadata
Assignees
Labels
RFCpost processingPost processingPost processingrenderingRendering related functionsRendering related functions