抗锯齿(AA,Anti-aliasing)
1、SSAA(super sampling anti-aliasing):每个像素生成N采样点,每个采样点执行一次fragment shader、拥有独立的color与depth存储空间,最后将各个采样点的数据累加求均得到输出,可以近似理解为将图片放大N后压缩回原图大小的方式。AA质量优秀,运算N,空间占用color N、depth N。
finalVal = (V0 + V1 ...... + V(n-1)) / N
2、MSAA(multi-sampling anti-aliasing):每个像素生成N采样点,每个像素执行一次fragment shader后结果写入到位于目标图元内的采样点,N采样点数据累加求均得到输出。AA质量优,运算1,空间占用color N、depth N。
finalVal = (VP0 + VP1 ...... VP(x-1) + VU0 + VU1...... + VU(y-1)) / N (VP表示位于目标图元内的采样点样本值,VU表示位于目标图元外的采样点样本初始值,x + y = N)
3、CSAA(coverage sampleing anti-aliasing):将生成的N采样点分成数个区域,如左上、左下、右上、右下四个区域,每个区域存储一份color、depth与区域内采样点数目的coverage值,每个像素执行一次fragment shader后将结果写入存在位于目标图元内的采样点的区域同时写入每个采样点对应的coverage值,区域的值与coverage求积累加后求均得出输出。AA效果良,运算1,空间占用color M,depth M,coverage N(M是采样点区域分割后的数量,coverage的存储为N但是消耗小,在M与N取得一定平衡时,CSAA能够在一定程度上减少存储开销)。
finalVal = (VA0*(VC0 + VC1 ...... + VC(x-1)) + VA1*(VC0 + VC1 ...... + VC(y-1)) ...... + VA(m-1)*(VC0 + VC1 ...... + VC(z-1))) / M (VA为区域存储值,VC为区域内对应采样点的coverage值,x、y、z为各个区域内采样点数目)
4、MSAA、SSAA、CSAA大部分硬件已经直接支持,但是运算与存储空间的消耗需要时刻关注。
5、Edge AA:根据相邻像素的depth与normal的差异进行边缘检测生成一个权重在相邻像素间进行插值,主旨是通过点来进行处理。
6、MLAA(morphological anti-aliasing):Intel推出的基于CPU处理的方案,它将Edge分类为Z、U、L等几种特定形状,最后都分解成L以确定一个三角形混合区域,根据具体实现还分为CPU MLAA、GPU MLAA、Jimenez's MLAA等。
7、FXAA(fast approximate anti-aliasing):NVIDIA 提供了一种接近MLAA的方案,它只是识别长边而不是形状,根据得到长边的直线方程运算像素每个样本的覆盖情况后进行混合。
8、DLAA(directionally localized anti-aliasing):在垂直方向上模糊后的图像上做水平方向上的边缘检测,得到的结果合成回去(感觉和高斯模糊很像了)。
9、Edge AA、MLAA、FXAA、DLAA都是属于后处理AA。
10、SRAA(subpixel reconstruction anti-aliasing):它寄予的事实是,shading的变化频率一般低于几何的变化频率,所以可以在较低分辨 率上shading,而用较高分辨率恢复几何。SRAA的基本流程为,在Deferred Shading的框架中,渲染一个高分辨率(或者带MSAA)的G-Buffer,但在shading的时候仅在普通的分辨率(或者没有MSAA)的情况下做。累积的结果通过G-Buffer重建sub-pixel信息,来进行类似MLAA的AA计算。
11、GPAA(geometric post-process anti-aliasing):在场景渲染完成后再对场景进行一次线框模式渲染,这个时候能够得到每个三角形对像素采样点的覆盖率,再进行DLAA或者CSAA那样的AA即可。