上篇文章讲述了几种基于post process的AA方法,有没有可能将post process AA和hardware AA结合起来呢?本篇要讲的正是这样的hybrid AA。
首先补充一下,对于MSAA的计算浪费,可以从下面的对比图看出来:
有了这个对比,大家应该有了直观感受,MSAA实际上把很多计算量浪费在了实际上不必要AA的像素上了。如果样本数高,浪费会更严重。
上一篇提到的那些基于post process的方法其实都在做一件事情:试图通过pixel信息估计出sub-pixel级别的几何,然后做AA。Edge AA是通过独立点来估计,MLAA是通过L形来估计,FXAA和DLAA是通过线段来估计。Hybrid AA的方法想表达的是,为什么要“估计”,而不是干脆就先存出sub-pixel的几何?
SRAA
Subpixel Reconstruction Anti-Aliasing是NVIDIA的研究员在I3D2011上发表的新方法。它寄予的事实是,shading的变化频率一般低于几何的变化频率,所以可以在较低分辨率上shading,而用较高分辨率恢复几何。SRAA的基本流程为,在Deferred Shading的框架中,渲染一个高分辨率(或者带MSAA)的G-Buffer,但在shading的时候仅在普通的分辨率(或者没有MSAA)的情况下做。累积的结果通过G-Buffer重建sub-pixel信息,来进行类似MLAA的AA计算。这种方法结合了MSAA和MLAA,但可以用较低的样本数做到较高的MSAA才能得到的效果,同时不增加shading的计算量。SRAA由于原理问题,只能用在Deferred框架中(不过对于现代的游戏来说这不是个大问题)。
GPAA
Geometric Post-process Anti-Aliasing是Humus独立提出来的AA方法。基本思路是在渲染几何之后在此用线框模式渲染一遍,这时候可以得到每个三角形在每个pixel的覆盖率:
这种方法的代价是多了一遍线框渲染,但可以用于Forward和Deferred两种框架。杯具的是,Humus的twitter上说这种方法实际上在1996年就被别人申请专利了。
Adaptive AA
Intel在SIGGRAPH 2010的course Deferred Rendering for Current and Future Rendering Pipelines上提到了一种很简单很暴力的AA方法,在edge的地方per-sample计算,在non-edge的地方per-pixel计算。和基于post process的方法一样,这需要执行一个边缘检测,并在stencil中标记出来,然后就可以分别计算了。下图中红线标记的地方就是检测出来的edge:
这种方法的结果会和SSAA一样,同时没有MSAA重复计算的毛病。
总结
Hybrid AA综合了hardware AA和post process AA的优点(或者说,缺点)。优点是可以用低于hardware AA的内存开销和计算量达到一样的效果。缺点是需要修改原有的图形渲染流水线。
本系列总结了三类不同的空间AA方法,希望对大家有所帮助。
Comments