2

ウィンドウに 2 つのビューポートを作成しようとしています。1 つはメインの全画面表示、もう 1 つは左上隅の小さい表示です。問題を調べて解決策を調べました。 glScissor() と glViewport() を使用し、深度バッファー ビットをクリアし、深度バッファー ビットを有効にし、(for ループの後) 1 回だけレンダリングしています。しかし、明らかに、私は何かが欠けています。これが私のコードです。前もって感謝します。

編集: スクリーンショットへのリンク: http://imgur[dot]com/a/sdoUy 基本的に、左上のミニ ビューポートがちらつき、消えてはすぐに再表示されます。

void viewports() {
float width = wWidth;
float height = wHeight; 

for (int i = 0; i < 2; i++) {
    glClearColor(.392,.584,.929,0.0f);

    if (i == 0) {
        //main view
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glViewport(0,0,(GLsizei)width,(GLsizei)height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,(GLfloat)width/(GLfloat)height,1.0,100.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        keyOp();
        camera();
    } else if (i == 1) {
        glScissor(0,height - height/3,(GLsizei)height/3,(GLsizei)height/3);
        glEnable(GL_SCISSOR_TEST);
        glClear(GL_DEPTH_BUFFER_BIT);
        glViewport(0,height - height/3,(GLsizei)height/3,(GLsizei)height/3);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,1,1.0,100.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0,40,-15,0,-1,-15,1,0,0);
        glDisable(GL_SCISSOR_TEST);
    }
    renderScene();
}
}
4

2 に答える 2

3

renderscene で glutSwapBuffers を呼び出さないでください。フレームごとに renderscene を 2 回呼び出す (i==0 と i==1 の場合) ため、メイン画面を描画し、スワップし、ミニマップを描画し、スワップし、繰り返します。

メインマップとミニマップの両方を描画してから交換する必要があります。

また、glClearColor を何度も呼び出す必要はありません。初期化時に 1 回だけ呼び出す必要があります。

于 2012-05-16T02:29:10.450 に答える
0

ちらつきの問題に役立つかどうかはわかりませんが、次のように書いていることに気付きました。

glClearColor(.392,.584,929,0.0f);

3 番目のパラメーターが 929 であり、私が想定したものではなく、.929 です。

于 2012-05-16T00:59:53.457 に答える