单缓冲(GLUT_SINGLE)和双缓冲绘图(GLUT_DOUBLE)之间的区别

时间:2015-02-03 12:08:52

标签: opengl

我正在使用example here,它可以在

下使用

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

但是当我将其设置为

时,它会变成透明窗口
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

但我需要该示例使用GLUT_DOUBLE模式下的一些绘图。

那么GLUT_DOUBLEGLUT_SINGLE之间有什么区别?

2 个答案:

答案 0 :(得分:23)

使用GL_SINGLE时,您可以直接将代码绘制到显示屏上。

使用GL_DOUBLE时,您可以拍摄两张缓冲区。其中一个总是可见的,另一个则不然。您始终渲染到当前可见的缓冲区。当您完成渲染帧时,您将交换两个缓冲区,使您刚才渲染的缓冲区可见。之前可见的那个现在是不可见的,您可以使用它来渲染下一帧。因此,每帧反转两个缓冲区的作用。

实际上,在大多数现代系统中,底层实现的工作方式有所不同。例如,某些平台使用三重缓冲来防止在请求缓冲区交换时发生阻塞。但这通常不关心你。关键是它表现就像你有两个缓冲区一样。

除了在glutInitDisplayMode()的参数中指定不同的标志之外,主要区别在于您在显示功能结束时进行的调用。这是在glutDisplayFunc()中注册的功能,在您链接的代码中为DrawCube()

  • 在单缓冲模式下,最后调用它:

    glFlush();
    
  • 在双缓冲模式下,您可以调用:

    glutSwapBuffers();
    

因此,当您使用glFlush()时,您需要做的就是将DrawCube()末尾的glutSwapBuffers()替换为GLUT_DOUBLE

答案 1 :(得分:2)

当绘制到单个缓冲上下文(GLUT_SINGLE)时,只有一个帧缓冲区用于绘制和显示内容。这意味着,您可以或多或少地直接绘制到屏幕上。此外,框架中最后绘制的内容显示的时间更短,然后是对象。

在双缓冲场景(GLUT_DOUBLE)中,存在两个帧缓冲区。一个用于绘图,另一个用于显示。在每个帧的末尾,交换这些缓冲区。这样,只有在帧完成且所有对象同时可见时,视图才会立即更改。

该说法:您确定透明窗口是由GL_DOUBLE引起的,而不是使用GL_RGBA而不是GL_RGB吗?