2012-12-09 66 views
0

我有一個程序監視文本文件的變化,當檢測到一個時,用戶可以選擇基於這個文本文件的內容重新顯示屏幕。我的問題是,當請求一個新的屏幕時,前一個屏幕的內容會保留,而新的內容與它重疊。我希望屏幕在屏幕上顯示新數據之前清除。在GLUT,C++的按鍵清除屏幕

這裏是我有:

void keyboard(unsigned char key, int x, int y){ 
    if(key == 'c'){ 
     c_pressed++; 
     cout<<"c pressed: "<<c_pressed<<"sound.txt cleared..."<<endl; 
     clear_file(); 
    } 
    if(key=='v'){ 
     v_pressed++; 
     cout<<"v pressed: "<<v_pressed<<"displaying new configuration..."<<endl; 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
     glutPostRedisplay(); 
    } 
} 

當鍵「C」被按下時,文本文件被清除。我已經驗證了這項工作正常。然後,在單獨的程序將新數據加載到文本文件中後,用戶按下'v'加載這些新指令。我試着將清除功能的「V」語句中,和以及在顯示功能...

void display(void){ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    read_in_sound();  
    cout<<"Number of sound events: "<<numLines<<endl; 

    for(int j=0; j<numLines; j++){ 
     if(data[0+j*4]==1){ 
      circle(0,0,200,50); 
     } 

     if(data[1+j*4]==1){ 
      circle(0,400,200,50); 
     } 

     if(data[2+j*4]==1){ 
      circle(400,400,200,50); 
     } 

     if(data[3+j*4]==1){ 
      circle(400,0,200,50); 
     }  
    } 
    glFlush(); 
    glutSwapBuffers(); 
} 

但是,當我打電話重新顯示,同時顯示新舊屏幕。

回答

2

作爲一般規則,您應該只從顯示函數執行OpenGL繪圖調用(並清除場景是繪圖調用)。如果OpenGL場景中的某些東西改變了規範的方式,則重繪整個事物。因此,對任何事件作出反應,您都會更改程序狀態併發出重繪,最終將使用OpenGL重新繪製場景。

如果場景非常複雜,那麼只需要使用不透明幾何體更新場景(任何需要混合的任務都需要完全重繪),則應該使用將場景顏色和深度緩衝區存儲到紋理並使用它們從一個明確的狀態。理想情況下,你使用幀緩衝對象。

0

這可能不是世界上最好的方法,但我添加了一個矩形對象,該對象的大小與每次我想「重繪」時調用的黑色背景相匹配。它可以節省從寫入幀緩衝區的時間,比如前面提出的答案。