我在这里使用示例,它可以在
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
但是当我将其设置为
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
但我需要该示例在GLUT_DOUBLE
模式下使用一些绘图。
那么GLUT_DOUBLE
和GLUT_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
引起的吗?