You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLUT游戏模式下无法设置显示回调,程序崩溃问题求助

GLUT游戏模式启动崩溃问题:redisplay needed for window 1, but no display callback

环境信息

  • 开发语言:C
  • 编译器:MinGW GCC 4.7.2
  • GLUT实现:GLUTMing

主入口代码

int main(int argc, char **argv) {
    // init GLUT and create window
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(800,600);
    glutCreateWindow("GLW");
    glClearColor(0.2,0.2,1.0,1.0);
    // enter gamemode
    glutGameModeString("800x600:32");
    if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
        glutEnterGameMode();
    else {
        printf("The select mode is not available\n");
        exit(1);
    }
    // register callbacks
    glutDisplayFunc(renderScene);
    glutIdleFunc(renderScene);

    // OpenGL init
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    glutMainLoop();

    return 0;
}

渲染回调函数代码

void renderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0.9f, 0.9f, 0.9f);
    glBegin(GL_TRIANGLES);
        glVertex3f(-2,-2,-5.0);
        glVertex3f(0,2,-5.0);
        glVertex3f(2,-2,-5.0);
    glEnd();
    glutSwapBuffers();
    glutPostRedisplay();
}

问题现象

窗口模式运行正常,但添加glutEnterGameMode()后程序启动即崩溃,报错:redisplay needed for window 1, but no display callback,需排查进入游戏模式时遗漏的步骤。


原因分析与解决办法

问题根源

调用glutEnterGameMode()时,GLUT会创建新的全屏游戏窗口,但你是在进入游戏模式之后才注册glutDisplayFunc和glutIdleFunc,此时新窗口已存在却未绑定回调,触发重绘时找不到对应函数,导致崩溃。同时,提前创建的窗口glutCreateWindow("GLW")属于冗余资源,会引发上下文冲突。

修复步骤

  1. 调整回调注册时机:先注册回调函数,再调用glutEnterGameMode(),确保新窗口创建时能绑定回调。
  2. 移除冗余窗口创建:删除glutCreateWindow("GLW")相关代码,游戏模式会自动创建独立全屏窗口。
  3. 调整OpenGL状态设置位置:glClearColor、glEnable等状态设置需放在进入游戏模式之后,确保作用在游戏窗口的OpenGL上下文上。

修改后的主入口代码

int main(int argc, char **argv) {
    // 初始化GLUT
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    
    // 先注册回调函数
    glutDisplayFunc(renderScene);
    glutIdleFunc(renderScene);

    // 配置并进入游戏模式
    glutGameModeString("800x600:32");
    if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
        glutEnterGameMode();
    else {
        printf("所选模式不可用\n");
        exit(1);
    }

    // 初始化OpenGL状态(此时上下文为游戏窗口)
    glClearColor(0.2, 0.2, 1.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    glutMainLoop();

    return 0;
}

内容的提问来源于stack exchange,提问作者Boyfinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:36:24