OpenGL中的多重采样

来源:互联网 发布:云杉网络如何 编辑:程序博客网 时间:2024/05/16 09:45
     OpenGL中的多重采样

       抗锯齿处理的最大优点之一就是它能够使多边形的边缘更为平滑,使渲染效果显得更为逼真和自然。点和直线的抗锯齿处理是得到广泛支持的,但遗憾的是,对多边形的平滑处理并没有在所有平台上都得到实现。并且,即使在可以使用GL_POLYGON_SMOOTH的时候,对整个场景进行抗锯齿处理也没有想象中的那么方便。这是因为,抗锯齿处理是基于混合操作的,这就需要从前到后对所有的图元进行排序,这是十分麻烦的。

     在OpenGL中还有一个功能,称为多重采样(multisampling),可以用来解决抗锯齿处理中的这个问题。支持多重采样的OpenGL实现中,在已经包含了颜色、深度、模板值的帧缓冲区中还会添加一个额外的缓冲区,所有的图元在每个像素上都进行多次采样,其结果就存储在这个新增的缓冲区中。每次当像素进行更新时,就会针对这些采样值进行解析,以产生一个单独的值。这个处理属于是在“幕后发生的事情”,它会带来额外的内存和处理器开销,会对性能造成一定的影响。因此,有些OpenGL实现可能并不支持多渲染环境中的多重采样处理。

     为了进行多重采样,首先必须获得一个支持多重采样帧缓冲区的渲染环境,这在不同的平台中获取方法可能各不相同。GLUT提供了一个位段(GLUT_MULTISAMPLE),允许请求这种帧缓冲区。例如,为了请求一个多重采样、完全颜色、带深度的双缓冲帧缓冲区,可以调用:

     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);

     然后,我们可以使用glEnable/glDisable组合来打开或关闭多重采样:
     
     // 打开多重采样
     glEnable(GL_MULTISAMPLE); 

     // 关闭多重采样
     glDisable(GL_MULTISAMPLE);

     关于多重采样还需要特别注意的一个地方是当它被启用时,点、直线和多边形的平滑特性都将被忽略(如果开启了的话)。这意味着在使用多重采样时,就不能同时使用点、直线和多边形的平滑处理了。但是在有些情况下,点和直线如果采用平滑处理可能会比使用多重采样得到的效果更好。因此,当我们绘制点和直线时,可以关闭多重采样,在绘制其它实心几何图形时再打开多重采样。代码如下所示:

     // 关闭多重采样
     glDisable(GL_MULTISAMPLE);
     // 打开顶点的平滑处理
     glEnable(GL_POINT_SMOOTH);
     
     // 绘制一些平滑的点
     // ... 

     // 关闭顶点的平滑处理
     glDisable(GL_POINT_SMOOTH);
     // 打开多重采样
     glEnable(GL_MULTISAMPLE);

     注意,如果没有多重采样缓冲区,OpenGL就会把GL_MULTISAMPLE当做是被禁用的。
     多重采样缓冲区在默认情况下使用片段的RGB值,并不包括颜色的alpha成分。我们可以通过调用glEnable方法配合下面的参数来修改这个行为:

     GL_SAMPLE_ALPHA_TO_COVERAGE     使用alpha值
     GL_SAMPLE_ALPHA_TO_ONE     把alpha值设为1,并使用它
     GL_SAMPLE_COVERAGE     使用glSampleCoverage函数所设置的值

     当启用了GL_SAMPLE_COVERAGE时,glSampleCoverage函数允许指定一个特定的值,它是与片断覆盖值进行位与(AND)操作的结果。

     void glSampleCoverage(GLclampf value, GLboolean invert);

     这种对多重采样的优化并不是严格由OpenGL规范所规定的,其确切的结果可能因不同的OpenGL实现而异。

     OpenGL中的状态排序
     打开或关闭不同的OpenGL特性将会修改驱动程序的内部状态,这种状态的改变可能会对渲染的性能造成影响。所以,对性能非常敏感的程序员常常会不辞辛苦地对所有的绘图命令进行排序,使需要相同状态的几何图形在一起进行绘制。这种状态排序的手段是游戏程序员非常常用的提高渲染速度的方法之一。

        未完待续...


     本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng
0 0
原创粉丝点击