入门图形学:抗锯齿

     抗锯齿(anti-aliasing)这个名词我相信大家都听说过,特别是玩单机游戏挺常见的,如果你和我一样用的一张性能一般般的显卡(虽然我公司开发机是gtx1080,但我家里自用的gtx750ti),偶尔在家玩单机游戏的时候,那个“狗牙”(锯齿)可严重了。

     先来说下锯齿如何产生的,锯齿嘛,顾名思义,想像一下链锯的锯条,图片如下:

    

     那么为什么三维引擎中,会产生锯齿呢?前面我们谈过图形流水线,在光栅化的过程中,三维空间中的一条线(或者说一条边)经过MVP变换还有透视除法视图变换后显示在由一个一个像素点组成的像素点显示矩阵上(不清楚的可以回去看一下),那就肯定会出现一种情况:这条线(边)在显示器像素矩阵上占据的像素点并不平滑,显示器像素矩阵是横纵排列的,如果是直线或者竖线还好,占据n行或m列像素点。如果是斜线,那就不好处理了,光栅算法最终就会处理成“楼梯”一样的像素点占用形式,如下图:

    

     我觉得我上面写的应该很通俗易懂吧,这个大致就是图形学中锯齿产生的原因。

     那既然锯齿产生会如此常见,那么抗锯齿技术就显得很重要了,我们已经知道锯齿的产生是因为光栅化的关系,那么抗锯齿技术就应该处于图形流水线帧缓存之后,下面了解一下抗锯齿技术:

     full scene anti-aliasing(FSAA)(全屏抗锯齿)

     利用抗锯齿算法技术对输出到显示器的帧画面进行放大采样后重新生成帧画面,最后输出到显示器显示的技术。其中的抗锯齿算法有以下几种:

     1.super-sampling anti-aliasing (SSAA)(超级采样抗锯齿)

      iphone苹果机的屏幕理念:人类肉眼无法分辨超过326dpi(DPI)的像素点,还给自家iphone4的屏幕取了一个名字:视网膜屏。言下之意就是如果一副texture2D画面的width和height数值对应其物理世界的宽高达到了326DPI及以上,我们肉眼就观察不出来其边线锯齿的存在了(反之就是一副texture2D画面width和height数值太低,而实际物理宽高又太大,那就不止锯齿了,那就是马赛克了),而SSAA技术就是把camera渲染的三维世界的画面”超采样“多倍,比如我的显示器是1920*1080的,那么开启了2倍SSAA就是采样camera画面达到3840*2160(或者开启4x 8x),然后将这一副3840*2160的超清画面缩放到1920*1080的显示像素矩阵上,则实现了消除锯齿的情况,但是这种技术性能消耗大,画面放大都是呈2^2倍的比例消耗资源。

      2.multi-sampling anti-aliasing(MSAA)(多重采样抗锯齿)

      MSAA是SSAA的一种优化版本,MSAA只对物体边缘部分的像素进行超采样,然后缩放还原处理,所以原理和SSAA类似,不过只处理需要”抗锯齿“的部分,所以性能比SSAA高。MSAA只对zbuffer和stencilbuffer中的数据进行超采样抗锯齿处理,因为这两个buffer可以得到点线面之间的z深度和遮挡关系,所以使用算法可以得到边缘像素并处理。MSAA是三维图形中常用的抗锯齿算法。

     3.coverage-sampling anti-aliasing(CSAA)(覆盖采样抗锯齿)enhanced quality anti-aliasing(EQAA)(增强质量抗锯齿)

     CSAA和EQAA属于MSAA的一个优化处理技术,CSAA和EQAA新增了一种覆盖采样的技术,覆盖采样不是对像素点进行完全的采样,而是简单的检测一个多边形是否存在,这可以用来对这个像素最终的颜色处理,可以说是一种优化了多边形边缘查找效率的MSAA,且实际应用中效率提升明显,测试16xCSAA只比4xMSAA消耗略高 ,且性能达到了8xMSAA的的水平。

     4.custom-filter anti-alaising(CFAA)(可编程抗锯齿)

     CFAA是扩大了取样面积的MSAA,原本的MSAA使用固定的算法提取物体边缘,接着超采样缩放,那么非物体边缘则不做任何处理,最终和处理后的物体边缘进行”拼接“,特殊情况下还是会出现”观感问题“,可能会感觉到纹理连续性不一致,那么CFAA则通过三方算法灵活选择抗锯齿处理区域,用较少的性能牺牲换取较好的平滑效果。

    5.fast-approximate anti-alaising(FXAA)(快速近似抗锯齿)

    FXAA从原理上不同于以上的抗锯齿技术,FXAA是后期着色器effectshader中实现的,应该算是最能自主编写效果的抗锯齿技术了,FXAA的原理就是使用边缘检测滤波器处理屏幕纹理,然后将边缘像素用高斯滤波器进行加权混合,达到查找边缘并混合模糊的目的。FXAA的做法性能最好,就是一个后期shader,但FXAA只算一种”虚假“的抗锯齿技术,严格来说属于”模糊“锯齿,FXAA常用在极端追求运行性能的情况下(比如说手机和其他嵌入式设备上),动态效果通常也不如MSAA,目前主流还是使用MSAA及其优化版本CSAA/EQAA/CFAA。

   

 

    

    

     

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值