今天组里同学询问关于抗锯齿的问题,我尽量简化成人话方便理解。
关于抗锯齿的技术有很多种,有的基于硬件,有的则完全依赖算法计算。总的来说,锯齿是软硬件沟通差异导致的问题,是开发者最常见的问题之一。
实际上很多引擎或三维包都自带抗锯齿算法,比如FXAA, MSAA, SSAA等。知道其中原理有助于我们因地制宜地选择相应技术实现甲方的无耻需求,也可以方便的实现自己下流的目的。
SSAA
图像缩放抗锯齿技术。
原理:
输出屏幕结果时,先生成一个更大分辨率的图像,然后再缩放成为目标分辨率图像。由于最终输出的每个像素都是由多个精确像素合并得到的,属于一种通杀的方案,不管是不是边缘都会进行计算,所以这个效果最好,也是性能最差的。
MSAA
模型边缘抗锯齿技术。
原理:一种硬件抗锯齿技术。在顶点渲染器光栅化阶段,根据深度获取需要处理的边缘再做抗锯齿处理。
相比ssaa那种全屏抗锯齿,MSAA只对边缘进行处理,所以性能会好很多。MSAA的缺陷在于,虽然节省了被覆盖或是除边缘外的像素计算,但如果有相同颜色的边重合等一些不需要进行抗锯齿的像素也会被进行计算。所以在多边形较多的场景中还是会有性能浪费。
FXAA抗锯齿11
后期边缘检测抗锯齿技术。
原理:一种后期抗锯齿技术,基本思路就是取得已经渲染完成的画面,进行使用卷积或相邻颜色差等方法进行边缘检测,然后针对被检测出来的边缘进行边缘模糊处理。这种方案性能最好,但由于边缘检测的精度和深度问题,效果和精度是有偏差的。