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")属于冗余资源,会引发上下文冲突。
修复步骤
- 调整回调注册时机:先注册回调函数,再调用
glutEnterGameMode(),确保新窗口创建时能绑定回调。 - 移除冗余窗口创建:删除
glutCreateWindow("GLW")相关代码,游戏模式会自动创建独立全屏窗口。 - 调整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
相关产品推荐
相关产品推荐

