原因
当我们放大图片的时候会发现图片上的像素点有很多锯齿形状,这样就会导致图片呈现的效果不佳,所以需要通过抗锯齿处理。
方式
抗锯齿的方式有两种,一种是混合(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函数允许指定⼀个特定的值,它是与片段覆盖值进⾏按位与操作的结果。
但是一般情况下,默认的设置已经足够我们日常开发使用,如果遇到需要修改的话,可以通过上述进行修改
网友评论