2012-12-09 4 views
0

텍스트 파일의 변경 사항을 모니터링하는 프로그램이 있으며이 파일을 감지하면이 텍스트 파일의 내용을 기반으로 화면을 다시 표시 할 수 있습니다. 내 문제는 새 화면이 요청되면 이전 화면의 내용이 그대로 유지되고 새 내용이 겹치는 것입니다. 새 데이터를 화면에 표시하기 전에 화면을 지우고 싶습니다. 키 'C'를 누르면 텍스트 파일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(); 
    } 
} 

를 클리어 : 여기

내가 가진 것입니다. 나는 이것이 제대로 작동하는지 확인했다. 그런 다음 별도의 프로그램이 새 데이터를 텍스트 파일로로드 한 후 사용자는 '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

이것은 세계에서 가장 좋은 방법은 아니지만 "다시 그리기"를 원할 때마다 호출되는 검정색 배경과 일치하는 창의 크기 인 사각형 개체를 추가했습니다. 제안 된 이전 답변과 마찬가지로 프레임 버퍼에 쓸 필요가 없으므로 시간을 절약 할 수 있습니다.