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
- OpenGL中的多重采样
- OpenGL中的多重采样
- 抗锯齿 多重采样 opengl超级宝典
- OpenGL多重采样的初始化问题
- 抗锯齿 多重采样 opengl超级宝典 P177
- DirectX9 多重采样
- OpenGL MSAA多采样中的蒙版(stencil)使用
- OpenGL--多重纹理
- OpenGL 多重纹理
- opengl多重纹理映射
- 21.OpenGL--多重纹理
- Opengl多重纹理
- 全屏反锯齿 - 多重采样Ⅰ
- Hadoop中的采样器
- 采样中的数据类型转换
- oracle中的采样数据
- C#+OpenGL编程之OpenGL 多重纹理
- 【OpenGL】使用随机采样实现soft shadow
- POJ1160--Post Office(四边形不等式优化)
- OpenMP 环境变量
- 目标跟踪小结
- 前缀、中缀、后缀表达式
- JDBC编程——缺少Mysql驱动的解决方法
- OpenGL中的多重采样
- MFC 如何响应StaticBox的点击事件
- birt报表分组
- 2014 年最热门的国人开发开源软件 TOP 100
- Swift中的枚举类型(一)
- Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解 JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写
- UVA3942(字典树加DP)
- 元素js_存dom对象表格增删以及编辑
- uva_145_Periodic Strings