我正在使用example here,它可以在
下使用 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
但是当我将其设置为
时,它会变成透明窗口glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
但我需要该示例使用GLUT_DOUBLE
模式下的一些绘图。
那么GLUT_DOUBLE
和GLUT_SINGLE
之间有什么区别?
答案 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吗?