2012-09-30 24 views
2

我有一個簡單的窗口,其背景色設置在主迴路與一些全局變量:如何強制GL應用程序中的背景顏色在調用glutPostRedisplay時立即更改?

頂部的全局值:

static GLfloat redIntensity = 0.0; //values for background color 
static GLfloat greenIntensity = 0.0; 
static GLfloat blueIntensity = 0.0; 

主要:

int main(int argc, char** argv){ 
    ... 
    glutDisplayFunc(display); 
    ... 
    glutKeyboardFunc(keyboard); //**** 
    glutMainLoop(); 
    return 0; 
} 

的顯示實際根據全局值設置顏色:

void display(void){ 

    glClear(GL_COLOR_BUFFER_BIT);  
    glPushMatrix();     
    glClearColor(redIntensity, greenIntensity, blueIntensity, 0.0); 
    ... 
    ... //other stuff here is polygon drawn in middle of screen 

    glPopMatrix(); 
    glutSwapBuffers(); 
    } 

在鍵盤功能,我有一個switch語句應該改變背景顏色取決於哪個鍵被按下,如:

... 
    case 'm': 
    { 
     redIntensity = 0.5; 
     greenIntensity = 0.0; 
     blueIntensity = 0.5; 
     bgc = MAGENTA; //another global thing to keep track of current color for other reasons... 
    } 
... 
glutPostRedisplay(); 

不幸的是,與glutPostRedisplay()電話,背景顏色不會立即更改..用戶必須先點擊其他地方或按另一個鍵。我在其他地方看到glutPostRedisplay()只是排隊重新顯示,所以我試着直接在後面添加glFlush()。這仍然沒有工作,所以我試圖在那裏調用glutDisplayFunc(display)。再一次,不成功。

如何在按下按鍵後強制改變顏色?主要或其他地方的訂購電話可能導致問題?嗯...

+1

澄清:'glutDisplayFunc(display)'只將函數'display'註冊爲顯示函數,它實際上並不調用顯示函數。是的,'glutPostRedisplay()'只會將重畫添加到隊列中。不保證立即發生重新顯示。 – Derek

回答

5

OpenGL是一個狀態機。當調用glClear時,它使用先前使用glClearColor,glClearDepth和glClearStencil設置的值。所以解決方法是在顯示glClear調用之前放置glClearColor調用。

相關問題