0

我有一个程序可以监视文本文件的更改,并且在检测到更改后,用户可以选择根据该文本文件的内容重新显示屏幕。我的问题是,当请求新屏幕时,前一个屏幕的内容会保留,而新内容会与它重叠。我希望在将新数据放在屏幕上之前清除屏幕。

这是我所拥有的:

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”语句中,以及在 display 函数中......

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 时,旧屏幕和新屏幕都会显示。

4

2 回答 2

2

作为一般规则,您应该仅从显示函数执行 OpenGL 绘图调用(并且清除场景是绘图调用)。如果 OpenGL 场景中的某些内容发生更改,规范的方法是重新绘制整个内容。因此,作为对任何事件的反应,您更改程序状态并发出重绘,最终将使用 OpenGL 重绘场景。

如果场景非常复杂,您只想用不透明的几何图形更新场景(任何需要混合的东西都需要完全重绘),您应该使用将场景颜色和深度缓冲区存储到纹理并使用它们从明确定义的状态开始. 理想情况下,您为此使用帧缓冲区对象。

于 2012-12-09T21:03:42.743 回答
0

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

于 2012-12-10T05:40:15.720 回答