OpenGL - Frage zur Verwendung von glDepthMask
Ich machte objectA in einer Szene wie folgt vor. Die Szene hat viele andere Objekte auch.
void Draw()
{
if( glIsList( displayListID ) )
{
glPushAttrib( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ENABLE_BIT );
glEnable( GL_BLEND );
glEnable( GL_DEPTH_TEST );
//glDepthMask( GL_FALSE );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LINE_SMOOTH );
glEnable( GL_POINT_SMOOTH );
glEnable( GL_POLYGON_SMOOTH );
glMatrixMode( GL_MODELVIEW );
color.setAlpha(alpha); //set alpha transparent of this objectA
glCallList( displayListID );
//glDepthMask( GL_TRUE );
glDisable( GL_BLEND );
glPopAttrib();
}
}
Hier ist nun das problem,
Wie gezeigt, ich kommentiere die beiden Zeilen
//glDepthMask( GL_FALSE );
//glDepthMask( GL_TRUE );
die Szene rendert die objectA und andere Objekte richtig in die Tiefe. Allerdings
die änderung der objectA alpha funktioniert nicht mehr (D. H. Farbe.setAlpha(alpha) ).
Wenn ich kommentieren Sie die oben genannten zwei Zeilen, dann alpha-Modifikation ist wieder an die Arbeit. Aber die Tiefe rendering ist NICHT korrekt. In anderen Worten, manchmal, die objectA sollte hinter anderen Objekten, aber es sieht aus wie die objectA ist vor alle Objekte.
Wie behebe ich dieses problem?
Danke
InformationsquelleAutor der Frage q0987 | 2010-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
glDepthMask( GL_TRUE )
glDepthMask( GL_FALSE )
BLEND_MODE
Warum tun Sie das?
Gibt es 2 Puffer, die Sie brauchen zu kümmern: die depth-buffer und die color buffer. Diese Puffer sind wirklich nur großen 2d-arrays, die jeweils die Breite x Höhe des Bildschirms.
Den color buffer natürlich halten die endgültige Färbung der einzelnen pixel. Es gibt einen Eintrag in der color-buffer pro Bildschirm-pixel. Die depth-buffer, ist wie der color buffer, dass es ein Eintrag pro Bildschirm-pixel, aber es ist für etwas anderes. Einträge in der depth-buffer sind ein Maß dafür, "wie nah" jedes farbige pixel wirklich ist.
Wenn Sie Rendern, 1 Dreieck, das ist weit Weg von der Kamera, es erzeugt eine Reihe von Farben und Tiefe Werte für jedes pixel es "will" - cover auf dem Bildschirm. Sagen Sie dann machen Sie eine weitere poly näher ist, es generiert zudem einen Satz von Werten für die Tiefe und Farbe-Puffer. Nun, es ist eine Art "Wettbewerb" auf pixel-Färbung Zeit, wo die "weiter Weg" - Fragmente (large depth-buffer Werte) werden verworfen, und nur die nächsten Fragmente aufbewahrt werden. Je näher Fragmente am Ende der Einfärbung der pixel, die Sie hatte. (Wenn zwei Polygone sind fast überlappenden, Z-fighting auftreten können)
Beginnen, indem das rendering der Objekte in Ihrer Szene mit der Tiefe Maske auf. Dies bedeutet, dass jede Form, die Sie machen, wenn seine Pixel eingefärbt, der depth-buffer aktualisiert wird mit dem "Gewinner" des Wettbewerbs.
Dann, Sie 3)
glDepthMask( GL_FALSE )
dreht aus der depth-buffer zum schreiben, 4) schalten Sie auf die Mischung, 5) render durchscheinenden Formen aus, die am weitesten zum nächsten. Scheint seltsam, nicht wahr?Beim ausschalten der Tiefe Maske und machen die durchscheinenden Formen, OpenGL noch Lesen den depth-buffer, um festzustellen, welche Fragmente wegwerfen (d.h. wenn Ihre durchscheinende Gestalt hinter eine bereits erbrachte fester Form, dann Sie zu werfen, dass die durchscheinende Gestalt der Fragmente entfernt). Aber es nicht schreiben Sie den depth-buffer, so dass, wenn eine lichtdurchlässige Form ist wirklich sehr nah an die Auge (sagen wie ein durchscheinend Windschutzscheibe), diese Windschutzscheibe Fragmente nicht verhindern, dass andere Fragmente, die sind eigentlich weiter Weg gezogen. Das ist wichtig, denn wenn die Windschutzscheibe ist direkt vor Ihnen, und Sie machen es lichtdurchlässig, und lassen Sie die Windschutzscheibe Fragmente aktualisieren Sie den depth-buffer dann sehen Sie nichts anderes in Ihrer Szene, mit Ausnahme der Windschutzscheibe, obwohl es Formen dahinter, denn OpenGL wird denken, "Hey, die Windschutzscheibe ist das einzige, was der Benutzer sehen soll, durch diese Tiefe Puffer-Lesungen, so will ich nicht stören rendering etwas weiter entfernt als dieser Scheibe, dann." Ausschalten der Tiefe Maske ist eine Möglichkeit der "Täuschung" OpenGL in "nicht-wissen" gibt es ganz in der Nähe, aber durchscheinend, Fragmente.
InformationsquelleAutor der Antwort bobobobo
Eine mögliche Lösung:
glDepthMask
zuGL_TRUE
zu allen Zeiten, und zeichnen Sie alle nicht-transparenten Objekte zuerst (in beliebiger Reihenfolge, so wie Sie scheinen, es zu tun jetzt), dann ziehen alle Ihre (semi-)transparenten Objekten sortiert von hinten nach vorne.In einigen Fällen, wenn Sie kümmern sich nicht um die Reihenfolge, in der die (semi-)transparenten Objekten gezeichnet werden und Sie wollen nur das andere, undurchsichtige Objekte zu "durchleuchten", die Sie überspringen können, Sortieren Sie Ihre (semi-)transparente Objekte.
InformationsquelleAutor der Antwort Greg S