设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——反走样
2015-02-25 22:43:25 来源: 作者: 【 】 浏览:16
Tags:OpenGL 超级 宝典 学习 笔记 走样

OpenGL的混合还可以用于反走样。在绝大多数情况下,一个渲染片段映射到屏幕上的一个像素。在屏幕上的像素是一个小方格。被着色的像素和未被着色的像素区分非常地明显。在这种情况下,可能会产生锯齿。锯齿是计算机生成图像的严重缺陷,使得图像看起来不自然。


image


(没有开启反走样)


image


(开启了反走样)


为了消除图元的锯齿,OpenGL使用混合把像素的目标颜色与周边像素的颜色进行混合。在图元的边缘上,像素的颜色会稍微延伸到相邻的像素上。


开启反走样,首先要开启alpha混合。


glEnable(GL_BLEND);


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


当然还可以通过glBlendEquation来改变混合方程。默认情况下是混合方程被设置为GL_ADD. 然后选择开启点反走样,线反走样,多边形反走样。


?


?


在使用GL_POLYGON_SMOOTH的时候要注意,未必能够使实心几何图元的边缘变得平滑,要实现这个目的还需要一些其他的工作。对实心物体进行抗锯齿处理并不常用,而且在很大程度上被多重采样的方法替代。


示例程序(可以通过右键菜单来切换反走样模式):


?


image


反走样可以是图元的边缘变得平滑,看起更加自然和逼真。点和线的平滑处理被广泛的支持,但是多边形的平滑处理并不是在所有的平台上都得到支持。即使GL_POLYGON_SMOOTH是可用的,但是使用起来没有你想象中的那么方便。因为是基于混合操作的,你需要对图元从前到后进行排序。


OpenGl增加了一个新特性 多重采样 (OpenGL1.3以上的版本) 来解决这个问题。


如果多重采样被支持的话,会在已经包含颜色、深度、模板值的帧缓冲区添加一个额外的缓冲区中。图元上的每一个像素会被多次采样,结果存储到这个缓冲区中。每次像素的更新,样本会被重新解析出一个值。当然,这会产生额外的内存和处理器的开销。


要使用多重采样,首先要获得一个支持多重采样缓冲区的渲染环境。在GLUT中可以在glutInitDisplayMode中,增加一个GLUT_MULTISAMPLE字段来获得一个多重采样的渲染环境。


glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB | GLUT_DEPTH | GLUT_MULTISMAPLE);


开启或关闭多重采样:


glEnable(GL_MULTSAMPLE); glDisable(GL_MULTSAMPLE);


效果对比:


image


当开启多重采样时,点、线、多边形的平滑处理将会被忽略。即点、线、多边形的平滑处理不能和多重采样同时存在。在给定的OpenGL实现上,如果点和线的平滑处理效果会比多重采样效果更好。那可以先关闭多重采样,使用点和线的平滑效果,然后再开启多重采样用于处理实心图元的锯齿。


?


如果没有设置多重采样的缓冲区,多重采样将不可用。


PS:打开或关闭OpenGL的特性会修改驱动程序的内部状态,这种状态的改变可能会对渲染的性能造成影响。为了提升性能,一般会把相同状态的绘制命令放在一起(状态排序)


多重采样缓冲区默认情况下使用片段的RGB值,不包含alpha值。可以用glEnable来改变。


GL_SAMPLE_ALPHA_TO_COVERAGE ——使用alpha值


GL_SAMPLE_ALPHA_TO_ONE —— 设置alpha值为1,并使用它。


GL_SAMPLE_COVERAGE——使用glSampleCoverage的设置。


当启用了GL_SAMPLE_COVERAGE时,glSampleCoverage函数指定了一个特定的值,它会和片段覆盖值进行与操作。


void glSampleCoverage(GLclampf value, GLboolean invert);


具体的多重采样的效果和OpenGl的具体实现有关。


多重采样示例:


?


image


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——混合 下一篇OpenGL超级宝典学习笔记——雾

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: