OpenGL学习之路(4.0) 实现抗锯齿效果

原因

当我们放大图片的时候会发现图片上的像素点有很多锯齿形状,这样就会导致图片呈现的效果不佳,所以需要通过抗锯齿处理。

方式

抗锯齿的方式有两种,一种是混合(GLBlend)处理抗锯齿,一种是多重采样抗锯齿

混合(GLBlend)处理抗锯齿

  • 需要注意的是,混合处理只能处理点和线段,多边形图形需要多重采样处理
  • 打开混合处理

    /**
     
     函数原型:
     
            void glHint(GLenum target,GLenum mod)
     
     参数说明:
     
           target:指定所控制行为的符号常量,可以是以下值
     
     GL_FOG_HINT:指定雾化计算的精度。如果OpenGL实现不能有效的支持每个像素的雾化计算,则GL_DONT_CARE和GL_FASTEST雾化效果中每个定点的计算。
     GL_LINE_SMOOTH_HINT:指定反走样线段的采样质量。如果应用较大的滤波函数,GL_NICEST在光栅化期间可以生成更多的像素段。
     GL_PERSPECTIVE_CORRECTION_HINT:指定颜色和纹理坐标的差值质量。如果OpenGL不能有效的支持透视修正参数差值,那么GL_DONT_CARE 和 GL_FASTEST可以执行颜色、纹理坐标的简单线性差值计算。
     GL_POINT_SMOOTH_HINT:指定反走样点的采样质量,如果应用较大的滤波函数,GL_NICEST在光栅化期间可以生成更多的像素段。
     GL_POLYGON_SMOOTH_HINT:指定反走样多边形的采样质量,如果应用较大的滤波函数,GL_NICEST在光栅化期间可以生成更多的像素段。
           mod:指定所采取行为的符号常量,可以是以下值
     
     GL_FASTEST:选择速度最快选项。
     GL_NICEST: 选择最高质量选项。
     GL_DONT_CARE:对选项不做考虑。
     函数说明:
     
           该函数控制OpenGL在某一方面有解释的余地时,所采取的操作行为。

     */

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//指定混合因子,默认就可以了,这里只要防止可能有被其他的方程式影响到,所以指定一次
    glEnable(GL_BLEND);//开启混合处理
    glEnable(GL_POINT_SMOOTH);//对点(指界面上所有的点)进行抗锯齿处理
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_LINE_SMOOTH);//对线进行抗锯齿处理
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_POLYGON_SMOOTH);//对多边形进行抗锯齿处理
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

  • 关闭混合处理

    //关闭抗锯齿
    glDisable(GL_BLEND);
    glDisable(GL_LINE_SMOOTH);
    glDisable(GL_POLYGON_SMOOTH);

多重采样抗锯齿

  • 1、可以调用glutInitDisplayMode 添加采样缓存区

    glutInitDisplayMode(GLUT_MULTISAMPLE);

  • 2、可以使用glEnable | glDisable 组合使用GLUT_MULTISAMPLE 打开|关闭多重采样

    glEnable(GLUT_MULTISAMPLE);
    glDisable(GLUT_MULTISAMPLE);

混合与多重采样综合使用


glDisable(GLUT_MULTISAMPLE);  //为了保证成功处理,先关闭多重采样
glEnable(GL_POINT_SMOOTH);  

//Draw some smooth point

glDisable(GL_POINT_SMOOTH);  
glDisable(GL_LINE_SMOOTH); 
glEnable(GLUT_MULTISAMPLE); //需要用到的时候再开启多重采样

//Draw some smooth polygon 写需要处理的多边形

多重采样拓展


    多重采样缓存区在默认情况下使⽤⽚段RGB值,并不包含颜⾊的alpha成分,我们可以通过调⽤glEnable来修改这个⾏为:
        GL_SAMPLE_ALPHA_TO_COVERAGE 使⽤alpha值
        GL_SAMPLE_ALPHA_TO_ON 使⽤alpha值并设为1,并使⽤它。
        GL_SAMPLE_COVERAGE  使⽤glSampleCoverage所设置的值。

    当启用 GL_SAMPLE_COVERAGE时,可以使⽤glSampleCoverage函数允许指定⼀个特定的值,它是与片段覆盖值进⾏按位与操作的结果。
    但是一般情况下,默认的设置已经足够我们日常开发使用,如果遇到需要修改的话,可以通过上述进行修改


你可能感兴趣的:(OpenGL学习之路(4.0) 实现抗锯齿效果)