opengl quad not rendering
我有一个来自书本示例的
有什么问题吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include"SDL.h" #include"SDL_opengl.h" #include <iostream> int main(int argc, char* args[]) { // Memory usage specifics SDL_Init(SDL_INIT_EVERYTHING); SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_BUFFER_SIZE, 32 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // name on the window SDL_WM_SetCaption("our first game", NULL ); //set screen SDL_SetVideoMode(600,400,32, SDL_OPENGL); // when screen is clear glClearColor(1,1,1,1); //red, green, blue, alpha //portion to display glViewport(0,0,600,400); //shade glShadeModel(GL_SMOOTH); // 3D or 2D glMatrixMode(GL_PROJECTION); glLoadIdentity(); //saves //if only 2D? glDisable(GL_DEPTH_TEST); //this handles the main loop bool isRunning = true; //this is for the events SDL_Event event; //main rectangle float myX = 300; float myY = 350; float width = 50; float height = 30; //main loop while ( isRunning ) { //EVENTS while ( SDL_PollEvent(&event) ) { //logic that should happen for certain events //quiting the window if ( event.type == SDL_QUIT ) { isRunning = false; } // if ESC pressed if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE ) { isRunning = false; } } //LOGIC //RENDERING TO THE SCREEN glClear(GL_COLOR_BUFFER_BIT); //start rendering phase glPushMatrix(); //set the matix glOrtho(0,600,400,0,-1,1); //black color glColor4ub(0,0,0,255); //drawing //GL_QUADS, GL_POINTS, GL_LINES, GL_LINE_STRIP, //GL_LINE_LOOP, GL_QUADS, GL_TRIANGLES, GL_POLIGON glBegin(GL_QUADS); glVertex2f(myX,myY); glVertex2f(myX+width,myY); glVertex2f(myX+width,myY+height); glVertex2f(myX,myY+height); glEnd(); //render SDL_GL_SwapBuffers(); } //house keeping SDL_Quit(); return 0; } |
这不足为奇,由于此行,您正在等待堆栈溢出:
1 2 | //start rendering phase glPushMatrix(); |
每帧,您将"当前"矩阵推到堆栈的顶部,并且从不弹出任何内容。最终,您将溢出并且
我可能会问为什么您首先将矩阵推到堆栈上?如果您重写每帧上的投影矩阵,您的代码将可以正常工作。
这些行也让我感到困惑:
1 2 3 | // 3D or 2D glMatrixMode(GL_PROJECTION); glLoadIdentity(); //saves |
1 2 3 4 | 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 |
由于
但是,更重要的是,假设您从不在代码的其他任何地方修改矩阵,则不必在每次绘制时都设置投影矩阵。 OpenGL会在缓冲区交换,清除等操作中保留其所有矩阵的状态。状态不会因为您开始新的帧而简单消失。