OpenGL项目编译无报错无法弹出显示窗口,报错0xC0000005如何解决
问题原因及修复方案
错误原因
main函数参数类型错误:glutInit要求传入的第一个参数是int*类型,你将argc定义为引用类型int&,传参时发生内存访问越界,直接触发0xC0000005错误码(内存访问违规)。
Display回调内嵌套百万次循环:GLUT是事件驱动框架,Display函数仅负责单次画面绘制,内部的死循环会完全阻塞GLUT的事件处理逻辑,导致窗口无法正常创建、响应渲染请求。
Reshape回调内递归触发重设窗口大小:glutReshapeWindow会主动触发Reshape回调,你在Reshape内部调用该函数会导致无限递归,最终栈溢出触发崩溃。
修复后的完整代码
#include <GL/glut.h> #define RATIO 1.2 #define WW 100 #define WH (WW/RATIO) #define HALFX ((int)(WW/2)) #define HALFY ((int)(WH/2)) #define deltat 0.001 int WindowWidth; int WindowHeight; void Display() { glLineWidth(4.0); float StartShape[12][2] = { {-15,-15},{-5,-15},{0,-5},{5,-15},{15,-15},{15,25},{5,25}, {5,-5},{0,0},{-5,-5},{-5,25},{-15,25} }; float EndShape[12][2] = { {-15,-15},{-5,-15},{-5,10},{0,0},{5,10},{5,-15},{15,-15}, {15,25},{5,25},{0,15},{-5,25},{-15,25} }; float IntermediateShape[12][2]; float VertexColors[12][3] = { {1,0,0},{1,1,0},{1,0,1},{0,1,0},{0,1,1},{0,0,1},{1,0.5,0}, {1,0,0.5},{0.5,1,0},{0.5,0,1},{1,0,0.5},{0,1,0.5} }; static float Tween = 0.0 - deltat; if (Tween < 1) { Tween += deltat; } // 如需循环播放动画,可取消下方注释 // else { // Tween = 0.0; // } for (int i = 0; i < 12; i++) { IntermediateShape[i][0] = (1 - Tween) * StartShape[i][0] + Tween * EndShape[i][0]; IntermediateShape[i][1] = (1 - Tween) * StartShape[i][1] + Tween * EndShape[i][1]; } glVertexPointer(2, GL_FLOAT, 0, IntermediateShape); glColorPointer(3, GL_FLOAT, 0, VertexColors); // 移除内部循环,单次绘制即可 glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_LINE_LOOP, 0, 12); glutSwapBuffers(); glutPostRedisplay(); } void InitGL() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-HALFX, HALFX, -HALFY, HALFY); glMatrixMode(GL_MODELVIEW); glClearColor(0, 0, 0, 0); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glShadeModel(GL_SMOOTH); glViewport(0, 0, WindowWidth, WindowHeight); } void Reshape(int w, int h) { // 移除glutReshapeWindow调用,仅更新内部变量和渲染参数即可 WindowWidth = w; WindowHeight = (int)(w / RATIO); InitGL(); } // 修改argc为值类型,不是引用 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); WindowWidth = (int)(glutGet((GLenum)GLUT_SCREEN_WIDTH) * 0.4); WindowHeight = (int)(WindowWidth / RATIO); glutInitWindowSize(WindowWidth, WindowHeight); glutInitWindowPosition(((int)glutGet((GLenum)GLUT_SCREEN_WIDTH) * 0.1), (glutGet((GLenum)GLUT_SCREEN_WIDTH) / 2) - (WindowHeight / 2)); glutCreateWindow("Bilguun Erdenebaatar Tweening Midterm Exam"); glutDisplayFunc(Display); glutReshapeFunc(Reshape); InitGL(); glutMainLoop(); return 0; }
内容的提问来源于stack exchange,提问作者Bilguun Erdenebaatar
相关产品推荐
相关产品推荐

