调整 OpenGL 窗口的大小会导致它崩溃

Posted

技术标签:

【中文标题】调整 OpenGL 窗口的大小会导致它崩溃【英文标题】:Resizing an OpenGL window causes it to fall apart 【发布时间】:2009-03-15 21:52:37 【问题描述】:

由于某种原因,当我调整 OpenGL 窗口的大小时,一切都崩溃了。图像失真,坐标不起作用,一切都崩溃了。我正在唱 Glut 来设置它。

//Code to setup glut
glutInitWindowSize(appWidth, appHeight);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("Test Window");

//In drawing function
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);

//Resize function
void resize(int w, int h)

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, h, 0);

OpenGL 应用程序是严格的 2D 的。

这是最初的样子:http://www.picgarage.net/images/Corre_53880_651.jpeg

这是调整大小后的样子:http://www.picgarage.net/images/wrong_53885_268.jpeg

【问题讨论】:

图像不再可用。 【参考方案1】:

你不应该忘记挂钩 GLUT 'reshape' 事件:

glutReshapeFunc(resize);

并重置您的视口:

void resize(int w, int h)

    glViewport(0, 0, width, height); //NEW
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, h, 0);

透视投影必须考虑新的纵横比:

void resizeWindow(int width, int height)

    double asratio;

    if (height == 0) height = 1; //to avoid divide-by-zero

    asratio = width / (double) height;

    glViewport(0, 0, width, height); //adjust GL viewport

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV, asratio, ZMIN, ZMAX); //adjust perspective
    glMatrixMode(GL_MODELVIEW);

【讨论】:

并用 static_cast 替换 C 风格的强制转换,因为您使用的是 C++ :)

以上是关于调整 OpenGL 窗口的大小会导致它崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 闪烁/损坏,窗口调整大小和 DWM 处于活动状态

调整窗口大小后交换渲染缓冲区会导致问题

调整窗口大小会导致位图被覆盖

使用 OpenGL 和 SDL 处理窗口大小调整

OpenGL - 调整窗口大小时保持纵横比

opengl:调整大小时如何将对象保留在窗口中