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

Difference between single buffered(GLUT_SINGLE) and double buffered drawing(GLUT_DOUBLE)

我正在使用 example here 它在

下工作

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

但是当我把它设置为

时它变成透明的 window
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

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

那么GLUT_DOUBLEGLUT_SINGLE有什么区别呢?

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

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

那个蜜蜂说:你确定透明 window 是由 GL_DOUBLE 而不是使用 GL_RGBA 而不是 GL_RGB 引起的吗?

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

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

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

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

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

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

    glutSwapBuffers();
    

所以你需要做的就是在使用GLUT_DOUBLE时将DrawCube()末尾的glFlush()替换为glutSwapBuffers()