您的位置:首页 > 运维架构

OpenGL单缓冲与双缓冲的区别

2017-10-18 10:28 986 查看

单缓存和双缓存

在我们电脑中,屏幕中显示的东西都会被放在一个称为显示缓存的地方,在通常情况下我们只有一个这样的缓冲区即单缓冲,在单缓冲中任何绘图的过程都会被显示在屏幕中,这也就是我们为什么会看到闪烁。而所谓双缓冲就是再这个显示的缓冲区之外再建立一个不显示的缓冲区,我们所有的绘图都将在这个不显示的缓冲区中进行,只有当一帧都绘制完了之后才会被拷贝到真正的现实缓冲区显示出来,这样中间过程对于最终用户就是不可见的了,那即使是速度比较慢也只会出现停顿而不会有闪烁的现象出现。

单缓存:帧缓存区开辟一个屏幕绘图缓存区。

双缓存:帧缓存区开辟两个屏幕绘图缓存区,交替使用,便于动画绘制 。

可以通过以下方法来设置窗口的展示模式为单缓冲或双缓冲

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glFlush(); //单缓冲的刷新模式;
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutSwapBuffers(); //双缓冲的刷新模式;


一般用OpenGL绘图都是用双缓冲,单缓冲一般只用于显示单独的一副非动态的图像。

使用深度测试函数:

在解决了闪烁的问题之后,我们来解决另一个问题:首先我们在窗口中画两个交叉的分别位于ZOX 和 ZOY 平面的长方形,并用不同的颜色填充它们,然后让它们旋转很快我们发现有个比较严重的问题,因为我们发现OpenGL显然没有空间的位置观念,因为它根本不能分辨物体的前后关系,当然也不能做出适当的显示。在OpenGL中我们使用深度缓冲区来解决这个问题,在这个缓冲区中存放着每个象素深度信息,当有一个新的象素需要显示的时候,我们可以通过一个被称为深度测试的函数来确定它们的先后关系。

使用 glEnable(GL_DEPTH_TEST)。在默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。

但是可以使用glDepthFunc(func)来对这种默认测试方式。其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)GL_NOTEQUAL(不等于),其中默认值是GL_LESS。

一般来讲,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。

启用了深度测试,那么这就不适用于同时绘制不透明物体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl