OpenGL - komischer Effekt

BrainPain

Well-Known Member
Moin Leute,

ich schaue mir grad ein paar OpenGL Tutorials (NeHe) an und mir ist in folgenden Beispiel ein seltsames Verhalten aufgefallen. In dem Beispiel wird eine Pyramide aus 4 Dreiecken gezeichnet und gedreht. Während der Drehung kommt es dazu das eine der Flächen (gelb) durch die Drehung nicht mehr sichtbar sein sollte jedoch trotzdem das verdeckende Dreieck überzeichnet. Weis jemand woran das liegen könnte?

Codeauszug:
Code:
           glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();

            glRotatef(theta, 0.0f, 0.5f, 0.5f);

            glBegin(GL_TRIANGLES);

            glColor3f(0.0f,0.0f,1.0f); // das vordere soll blau werden
            glVertex3f( 0.0f, 0.5f, 0.0f); // oben (vorderes Dreieck)
            glVertex3f(-0.5f,-0.5f, 0.5f); // links (vorderes Dreieck)
            glVertex3f( 0.5f,-0.5f, 0.5f); // rechts (vorderes Dreieck)

            glColor3f(1.0f,0.0f,0.0f); // das rechte soll rot werden
            glVertex3f( 0.0f, 0.5f, 0.0f);  // oben (rechtes Dreieck)
            glVertex3f( 0.5f,-0.5f, 0.5f);  // links (rechtes Dreieck)
            glVertex3f( 0.5f,-0.5f, -0.5f); // rechts (rechtes Dreieck)

            glColor3f(0.0f,1.0f,0.0f); // das hintere grün
            glVertex3f( 0.0f, 0.5f, 0.0f);  // oben (hinteres Dreieck)
            glVertex3f( 0.5f,-0.5f, -0.5f); // links (hinteres Dreieck)
            glVertex3f(-0.5f,-0.5f, -0.5f); // rechts (hinteres Dreieck)

            glColor3f(1.0f,1.0f,0.0f); // und das linke gelb
            glVertex3f( 0.0f, 0.5f, 0.0f); // oben (linkes Dreieck)
            glVertex3f(-0.5f,-0.5f,-0.5f); // links (linkes Dreieck)
            glVertex3f(-0.5f,-0.5f, 0.5f); // rechts (linkes Dreieck)

            glEnd();

            SwapBuffers(hDC);

            theta += 1.0f;
            Sleep (10);

Viele Grüße
 
Kein backface culling, kein depth test.

Danke für den Tipp.

Das Backface-Culling scheint in diesem Fall jedoch kontraproduktiv zu sein:
Code:
glEnable(GL_CULL_FACE);
Damit werden nur noch die Rückseiten der Dreiecke angezeigt und die Vorderseite ist transparent.

Der Depth-Test bringt jedenfalls das gewünschte Ergebnis:
Code:
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

Viele Grüße
 
Damit werden nur noch die Rückseiten der Dreiecke angezeigt und die Vorderseite ist transparent.
Da bleibt mir nur zu sagen: wlkikiv und rtfm. Das ist bei NeHe und in den OpenGL Manpages alles beschrieben.
 
Da bleibt mir nur zu sagen: wlkikiv und rtfm. Das ist bei NeHe und in den OpenGL Manpages alles beschrieben.

Seltsam, ich dachte ich wäre bei bsdforen.de, scheinbar bin ich doch in irgendeinem Linux-Forum gelandet.

Was soll ich denn nachlesen? Wie ich bereits geschrieben habe ist das Problem bereits gelöst...das wars. DANKE!
 
Das Nichtzeichen weggedrehter Oberflächen (Backface-Culling) ist wohl in den wenigsten Fällen kontraproduktiv.
Ich denke er meint, dass du, wenn du GL_CULL_FACE aktiviert hast, auch noch mit glCullFace() angeben musst, was denn nicht gezeichet (weggecullt) werden soll.
In den Zusammenhang solltest du dir glFrontFace() auch nochmal anschauen.
 
Zuletzt bearbeitet:
Zurück
Oben