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



我在这里使用示例,它可以在

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

但是当我将其设置为

glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

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

那么GLUT_DOUBLEGLUT_SINGLE有什么区别呢?

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

当使用GL_DOUBLE时,你可以想象有两个缓冲区。其中一个始终可见,另一个不可见。始终呈现到当前可见的缓冲区。渲染完帧后,交换两个缓冲区,使刚刚渲染的缓冲区可见。以前可见的帧现在不可见,您可以使用它来渲染下一帧。因此,两个缓冲区的作用每帧颠倒。

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

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

  • 在单缓冲区模式下,最后调用以下命令:

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

    glutSwapBuffers();
    

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

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

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

话虽如此:您确定透明窗口是由GL_DOUBLE而不是使用GL_RGBA而不是GL_RGB引起的吗?

最新更新