2013-10-27 146 views
0

我有一個GL_QUADS從一本書例子,我把顏色黑一個,我仍然沒有得到它,我得到的是我清晰的白色屏幕 什麼地方出錯了?OpenGL四相不渲染

#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; 
} 

回答

0

這並不奇怪,你有一個堆棧溢出等待發生,由於這一行:

//start rendering phase 
glPushMatrix(); 

每一幀,你推「當前」矩陣壓入堆棧的頂部,從不彈出任何東西。最終你會溢出並且glOrtho(0,600,400,0,-1,1);將會有未定義的結果。

我可以問你爲什麼把矩陣推到棧上?如果您在每一幀覆蓋了投影矩陣,那麼您的代碼就可以很好地工作。

我也爲這行代碼不解:

// 3D or 2D 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); //saves 

glLoadIdentity (...)不保存任何東西,它寫一個單位矩陣,以目前的矩陣:

1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

由於glOrtho (...)乘以當前矩陣,我實際上會替換第一個提到的代碼。這樣你將總是產生相同的結果,而不是乘以矩陣的前一個值。但是,更重要的是,假設您從不在代碼中的任何其他位置修改矩陣,您不必在每次繪製時都設置投影矩陣。 OpenGL通過緩衝區交換,清除等來保持其所有矩陣的狀態......狀態不會因爲您開始新的框架而消失。

+0

以及我基於此http://www.youtube.com/watch?v=RGgLEtWKGoM矩陣應該是像我的網格繪製,我留在矩陣顯示爲每個幀的循環? –

+0

@panchovilla除非您的窗口調整大小,否則通常沒有理由需要在簡單應用程序中重新定義矩陣。你可以通過在'SDL_GL_SwapBuffers();'之後加入'glPopMatrix(...)來解決這個問題,但是更好的解決方法是在每一幀期間都不要混淆矩陣。 –

+0

通過用第二個代碼替換第一個代碼是什麼意思?你的意思是用'glLoadIdentity'或'glortho'代替'glPushMatrix'?順便說一句,謝謝:) –