2012-12-09 64 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

这可能不是世界上最好的方法,但我添加了一个矩形对象,该对象的大小与每次我想“重绘”时调用的黑色背景相匹配。它可以节省从写入帧缓冲区的时间,比如前面提出的答案。