opengl 单缓冲(GLUT_SINGLE)和双缓冲绘图(GLUT_DOUBLE)之间的差异

i2byvkas  于 2022-12-18  发布在  其他
关注(0)|答案(2)|浏览(197)

我使用的是example here,它在下工作
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
但是当我把它设置为时,它变成了一个透明窗口

glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

但我需要在GLUT_DOUBLE模式下使用一些绘图示例。
那么GLUT_DOUBLEGLUT_SINGLE之间的区别是什么呢?

41ik7eoe

41ik7eoe1#

使用GL_SINGLE时,可以将代码绘图直接绘制到显示器上。
当使用GL_DOUBLE时,你可以想象有两个缓冲区。其中一个总是可见的,另一个不可见。你总是渲染到当前可见的缓冲区。当你渲染完帧时,你交换这两个缓冲区,使你刚才渲染的那个可见。之前可见的那个现在不可见了。然后你用它来渲染下一帧。所以这两个缓冲区的角色在每一帧都是颠倒的。
实际上,底层实现在大多数现代系统上的工作方式有些不同。例如,一些平台使用三重缓冲来防止请求缓冲区交换时的阻塞。但这通常与您无关。关键是它的行为就像您有两个缓冲区一样。
除了在glutInitDisplayMode()的参数中指定了不同的标志之外,主要的区别在于在display函数末尾进行的调用,这是注册到glutDisplayFunc()的函数,在链接的代码中是DrawCube()

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

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

vtwuwzda

vtwuwzda2#

当绘制到单个缓冲上下文(GLUT_SINGLE)时,只有一个帧缓冲区用于绘制和显示内容。这意味着,您或多或少直接绘制到屏幕。此外,帧中最后绘制的内容显示的时间段比开头的对象短。
在双缓冲场景(GLUT_DOUBLE)中,存在两个帧缓冲区。一个用于绘制,另一个用于显示。在每一帧结束时,这些缓冲区被交换。这样,视图仅在一帧完成并且所有对象同时可见时才被改变。
话虽如此:是否确定透明窗口是由GL_DOUBLE引起的,而不是使用GL_RGBA代替GL_RGB引起的?

相关问题