转载请标明出处:http://blog.csdn.net/yunchao_he/article/details/78354528
Multi-sampling或者说Multi-sample Anti-Alias (简称MSAA)是一种抗锯齿的技术,它通过在一个像素上进行多次采样多次计算并最终汇总(Resolve to single-sample),可使绘制的图像边缘更加平滑。通过这种方式绘制出来的图片质量更高,显得更真实。但同时,它对绘制的性能也会产生负面影响。所以,是否使用这项技术,需要开发者在图片质量(Quality)和性能(Performance)之间进行权衡。那么,MSAA到底对整个绘制流水线(Rendering Pipeline)产生了什么影响?本文将进行深入分析,从而帮助自己及读者在相关问题上有更深的理解,从而做出正确合理的决策:比如在开发过程中是否使用MSAA。
MSAA简介
首先简单讲一下什么是MSAA。MSAA就是把每个pixel(或者说fragment)细分为多个sub-pixel,比如分为4个、8个、16个甚至32个sub-pixel,分别对应MSAA4, MSAA8, MSAA16, MSAA32。我们知道,图形学里,每个piexl占据屏幕上的一小块矩形网格。比如对于1920*1280的显示器,就有1920*1280个小的矩形网格,每个网格都是一个pixel。而MSAA则把每个小的矩形网格再进行细分。比如MSAA4/MSAA8分别把每个piexl再分为4个或者8个sub-pixel,其中每一个sub-pixel称为一个sample。而正常pipeline里的所有per-pixel(per-fragment)的操作,打开MSAA后,理论上都可以per-sample来处理。这样,每个pixel里的多个sample, 都可以独立进行插值、独立执行fragment shader,计算出独立的颜色值、深度值。然后求出同一个pixel的所有sample的算术平均值(也就是resolve to single sample),就得出这个pixel的最终颜色。通过这种方式,图形边缘的绘制会更精细更平滑。当然,对于1920*1280的网格,MSAA4相当于在处理1920*1280*4个网格,计算量(以及显存里某些变量的存储空间)也是成倍增加。
MSAA分析
MSAA在Rendering Pipeline的过程中,可能的影响有以下几方面。
1)光栅化阶段(Rasterization)
光栅化阶段一个重要的工作就是插值计算(Interpolation),所以多重采样作用到这个阶段主要是多重插值。
这个阶段的multisampling可以分为几种,一种是重量级的多重插值,一种是定制化的多重插值,还有一种是轻量级的多重插值。当然,这只是我个人的简单分类,具体区别详见下文。
先讲重量级、重负载的多重插值。我们知道,在Rasterization阶段,需要对fragment shader阶段的所有inputs进行插值计算。可能的插值计算变量包括但不限于颜色,法线,纹理坐标等等。比如上图手绘的图片里,对三角形的绘制,开发者通常只设置顶点信息。这里以颜色为例,三个顶点A/B/C的颜色分别为蓝色、黑色、红色。三角形覆盖的区域(网格区),都是GPU在Rasterization阶段根据各个像素所在位置,进行插值计算,得出各个pixel/fragment的颜色值。这个颜色值显然是三个顶点颜色值的混合。理论上,凡是需要per-pixel插值的变量,也可以进行per-sample插值,也就是多重插值。注意,