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」ステートメント内と表示関数内に配置しようとしました...

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();
}

しかし、再表示を呼び出すと、古い画面と新しい画面の両方が表示されます。

4

2 に答える 2

2

原則として、ディスプレイ関数からのみ OpenGL 描画呼び出しを行う必要があります (シーンのクリアは描画呼び出しです)。OpenGL シーンの何かが変更された場合、標準的な方法は全体を再描画することです。したがって、イベントに反応してプログラムの状態を変更し、再描画を発行すると、最終的に OpenGL を使用してシーンが再描画されます。

シーンが非常に複雑で、不透明なジオメトリのみでシーンを更新したい場合 (ブレンディングが必要な場合は完全な再描画が必要です)、シーンの色と深度バッファーをテクスチャに保存し、それらを使用して明確に定義された状態から開始する必要があります。 . これにはフレームバッファ オブジェクトを使用するのが理想的です。

于 2012-12-09T21:03:42.743 に答える
0

これは最善の方法ではないかもしれませんが、「再描画」するたびに呼び出される黒い背景に一致するウィンドウのサイズである四角形オブジェクトを追加しました。前の回答が示唆したように、フレームバッファに書き込む時間を節約できます。

于 2012-12-10T05:40:15.720 に答える