我使用的是example here,它在下工作glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
但是当我把它设置为时,它变成了一个透明窗口
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
但我需要在GLUT_DOUBLE
模式下使用一些绘图示例。
那么GLUT_DOUBLE
和GLUT_SINGLE
之间的区别是什么呢?
我使用的是example here,它在下工作glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
但是当我把它设置为时,它变成了一个透明窗口
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
但我需要在GLUT_DOUBLE
模式下使用一些绘图示例。
那么GLUT_DOUBLE
和GLUT_SINGLE
之间的区别是什么呢?
2条答案
按热度按时间41ik7eoe1#
使用
GL_SINGLE
时,可以将代码绘图直接绘制到显示器上。当使用
GL_DOUBLE
时,你可以想象有两个缓冲区。其中一个总是可见的,另一个不可见。你总是渲染到不当前可见的缓冲区。当你渲染完帧时,你交换这两个缓冲区,使你刚才渲染的那个可见。之前可见的那个现在不可见了。然后你用它来渲染下一帧。所以这两个缓冲区的角色在每一帧都是颠倒的。实际上,底层实现在大多数现代系统上的工作方式有些不同。例如,一些平台使用三重缓冲来防止请求缓冲区交换时的阻塞。但这通常与您无关。关键是它的行为就像您有两个缓冲区一样。
除了在
glutInitDisplayMode()
的参数中指定了不同的标志之外,主要的区别在于在display函数末尾进行的调用,这是注册到glutDisplayFunc()
的函数,在链接的代码中是DrawCube()
。因此,在使用
GLUT_DOUBLE
时,您需要做的就是将DrawCube()
末尾的glFlush()
替换为glutSwapBuffers()
。vtwuwzda2#
当绘制到单个缓冲上下文(
GLUT_SINGLE
)时,只有一个帧缓冲区用于绘制和显示内容。这意味着,您或多或少直接绘制到屏幕。此外,帧中最后绘制的内容显示的时间段比开头的对象短。在双缓冲场景(
GLUT_DOUBLE
)中,存在两个帧缓冲区。一个用于绘制,另一个用于显示。在每一帧结束时,这些缓冲区被交换。这样,视图仅在一帧完成并且所有对象同时可见时才被改变。话虽如此:是否确定透明窗口是由
GL_DOUBLE
引起的,而不是使用GL_RGBA
代替GL_RGB
引起的?