2 Stimmen

OpenGL: Mehrere überlappende Viewports flackern

Ich versuche, zwei Blickfenster in meinem Fenster zu erstellen: eine Hauptansicht im Vollbildmodus und eine kleinere Ansicht in der oberen linken Ecke. Ich habe das Problem recherchiert und mir die Lösungen angesehen: Ich verwende glScissor() und glViewport(), lösche mein Tiefenpufferbit, aktiviere mein Tiefenpufferbit und rendere nur einmal (nach einer Schleife). Aber offensichtlich fehlt mir etwas. Hier ist mein Code. Vielen Dank im Voraus.

Bearbeiten: Link zu den Screenshots: http://imgur\[dot\]com/a/sdoUy Grundsätzlich flackert das Mini-Blickfenster oben links, verschwindet und erscheint sehr schnell wieder.

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

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

    if (i == 0) {
        //Hauptansicht
        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();
}
}

3voto

Tim Punkte 34753

Rufen Sie glutSwapBuffers nicht in renderscene auf. Sie rufen renderscene zweimal pro Frame auf (für i==0 und i==1), also zeichnen Sie den Hauptbildschirm, tauschen, zeichnen Sie die Minikarte, tauschen Sie, wiederholen Sie.

Sie müssen sowohl Haupt- als auch Minikarte zeichnen und dann tauschen.

Rufen Sie auch nicht so oft glClearColor auf, Sie müssen es nur einmal beim Initialisieren aufrufen.

0voto

RoneRackal Punkte 1253

Nicht sicher, ob es bei Ihrem Flimmern-Problem hilft, aber ich habe bemerkt, dass Sie Folgendes geschrieben haben:

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

Bei dem dritten Parameter handelt es sich um 929 anstelle von dem, was ich annehme, dass Sie wollten, .929

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X