一、锯齿是怎么产生的
二、抗锯齿介绍
1.SSAA(super sample anti-aliasing)
拿4xSSAA举例子,假设最终屏幕输出的分辨率是800x600, 4xSSAA就会先渲染到一个分辨率1600x1200的buffer上,然后再直接把这个放大4倍的buffer下采样至800x600。这种做法在数学上是最完美的抗锯齿。但是劣势也很明显,光栅化和着色的计算负荷都比原来多了4倍。
2.MSAA(Multisampling Antialising)
MSAA(Multi-Sampling AA)则很聪明的只是在光栅化阶段,判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample),但是在pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次。例如下图是4xMSAA,三角形只覆盖了4个coverage sample中的2个。所以这个三角形需要生成一个fragment在pixel shader里着色,只不过生成的fragment还是在像素中央(位置,法线等信息插值到像素中央)然后只运行一次pixel shader,最后得到的结果在resolve阶段会乘以0.5,因为这个三角形只cover了一半的sample。现代所有GPU都在硬件上实现了这个算法,而且在shading的运算量远大于光栅化的今天,这个方法远比SSAA快很多。顺便提一下之前NV的CSAA,它就是更进一步的把coverage sample和depth,stencil test分开了。
问题:MSAA的一个问题就是和现在大街小巷都是的deferred shading框架并不是那么兼容。因为用deferred shading的时候场景都先被光栅化到GBuffer上去了,不直接做shading。
3.TAA(Temporal Antialiasing)
- 把多次采样的过程分不到每一帧中去,每一帧都平均前面几帧保存下来的数据
- 每一帧会有一定的偏移,继承了MSAA采样
- 用motion vector保存每帧移动的偏移
TemporalAA之前
TemporalAA之后
问题:会有闪烁的情况。
4.FXAA(Fast Approximate Anti-Aliasing)(后处理)
- 利用边缘检测有效的模糊混合
5.SMAA
主流抗锯齿方案详解(四)SMAA