能否在GLUT程序中为不同窗口分别设置单缓冲与双缓冲?
如何在GLUT中为不同窗口设置不同的缓冲模式
当然可以实现。关键要明确:glutInitDisplayMode()的作用是为下一个即将创建的窗口指定显示模式,而非修改已存在的窗口。你之前用glutSetWindow()尝试修改已有窗口模式的思路行不通,因为窗口的缓冲模式在创建时就已经固定。
正确的实现步骤如下:
- 先设置第一个窗口的显示模式,创建窗口并注册对应回调函数
- 再设置第二个窗口的显示模式,创建第二个窗口并注册回调
- 在各自的显示回调中,使用对应缓冲模式的刷新函数:单缓冲用
glFlush(),双缓冲用glutSwapBuffers()
以下是完整的示例代码:
#include <GL/glut.h> // 存储两个窗口的ID int winSingle, winDouble; // 单缓冲窗口的显示回调 void drawSingleBuffer() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glBegin(GL_TRIANGLES); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); glVertex2f(0.0, 0.5); glEnd(); // 单缓冲模式下用glFlush刷新画面 glFlush(); } // 双缓冲窗口的显示回调 void drawDoubleBuffer() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 1.0, 0.0); glBegin(GL_QUADS); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); glVertex2f(0.5, 0.5); glVertex2f(-0.5, 0.5); glEnd(); // 双缓冲模式下用glutSwapBuffers交换前后缓冲 glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); // 创建单缓冲窗口 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(300, 300); glutInitWindowPosition(100, 100); winSingle = glutCreateWindow("单缓冲窗口"); glClearColor(0.1, 0.1, 0.1, 1.0); glutDisplayFunc(drawSingleBuffer); // 创建双缓冲窗口 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(300, 300); glutInitWindowPosition(450, 100); winDouble = glutCreateWindow("双缓冲窗口"); glClearColor(0.1, 0.1, 0.1, 1.0); glutDisplayFunc(drawDoubleBuffer); glutMainLoop(); return 0; }
关键注意事项
- 每次调用
glutCreateWindow()前,必须调用glutInitDisplayMode()指定当前要创建窗口的模式,这样每个窗口的缓冲模式会独立生效。 - 两个窗口的显示回调要严格区分刷新方式,否则会出现显示异常(比如双缓冲窗口用
glFlush会导致画面不更新,单缓冲窗口用glutSwapBuffers会引发错误)。 glutSetWindow()仅用于后续切换窗口进行绘制操作,无法修改窗口已确定的显示模式。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

