在GLUT,c ++中按键清除屏幕

时间:2012-12-09 20:34:58

标签: c++ opengl glut

我有一个监视文本文件以进行更改的程序,一旦检测到,就可以根据此文本文件的内容重新显示屏幕。我的问题是,当请求新屏幕时,前一个屏幕的内容会保留,而新内容会重叠。我希望在将新数据放到屏幕上之前清除屏幕。

这就是我所拥有的:

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”以加载这些新指令。我已经尝试将clear函数放在'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();
}

但是当我调用redisplay时,会显示旧屏幕和新屏幕。

2 个答案:

答案 0 :(得分:2)

作为一般规则,您应该仅从显示功能执行OpenGL绘图调用(并清除场景是绘图调用)。如果OpenGL场景中的某些东西改变了规范的方式是重绘整个事物。因此,在对任何事件做出反应时,您可以更改程序状态并发出重绘,这将最终使用OpenGL重绘场景。

如果场景非常复杂,你只想用仅不透明的几何体(任何需要混合要求完全重绘的场景)更新场景,你应该使用场景颜色和深度缓冲区存储到纹理并使用它们从一个开始明确的国家。理想情况下,您可以使用帧缓冲对象。

答案 1 :(得分:0)

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