2011-01-09 6 views
1

Ich gehe durch die NeHe Tutorials für OpenGL ... Ich bin in Lektion 8 (Zeichnen eines Würfels mit Mischen). http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08Anfänger Transparenz/undurchsichtig in OpenGL

Ich wollte undurchsichtig sind die Hälfte der Flächen experimentieren und zu ändern, so dass es immer eine halbtransparente Fläche gegenüber einem undurchsichtigen ist und in der Lage, die Würfel zu drehen ...

es das geändert Code ein wenig, ist die ganze Quelle dort: http://pastebin.com/uzfSk2wB ich ein paar Dinge geändert:

  • ermöglichen durch Standard Mischen und die Mischfunktion zu glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) gesetzt;
  • änderte die Reihenfolge der Zeichnung der Gesichter und Farben für jedes Gesicht.
    • habe ich die Tiefe Prüfung
    • ich alle undurchsichtigen Gesichter zeichnen
    • ich deaktivieren Tiefentest
    • ich alle transparenten Flächen zeichnen

Nun, es ist schwer zu sagen, genau Was läuft falsch, aber es sieht definitiv nicht richtig aus, ich kann nicht erkennen, welches Gesicht undurchsichtig ist im Vergleich zu den transparenten, manchmal scheinen manche Gesichter nicht gezeichnet zu werden, wenn sie sollten ... etc ...

Scheint zu berechnen, welches Gesicht vorne ist, verglichen mit dem Rücken wäre nicht trivial (obwohl ich sicher bin), ich hoffe, es gibt einen Weg, dies zu tun, würde nicht tun müssen.

Suchen Sie entweder nach dem, was in meinem Code falsch ist, oder ob dies nicht der richtige Weg ist, es in erster Linie zu tun.

+0

Bitte zeigen Sie ein Bild. Beschreiben Sie auch, was Sie falsch finden. – Bahbar

+0

Übrigens - Sie lernen gerade eine sehr veraltete und ineffektive Version von OpenGL. Durchsuchen Sie SO nach einigen Ressourcen für neuere OpenGL-Versionen, wenn Ihnen danach ist. Neuere Versionen sind auch bequemer! – Kos

Antwort

4

Wenn Sie die Tiefenprüfung deaktivieren, bevor Sie die transparenten Flächen zeichnen, werden sie ohne Rücksicht auf ihre korrekte Z-Reihenfolge gezeichnet. Es sieht wahrscheinlich so aus, als ob die transparenten Flächen auf allen anderen Flächen gezeichnet werden. Lassen Sie die Tiefenprüfung eingeschaltet.

+1

Sie sollten den Tiefentest tatsächlich aktivieren, damit die undurchsichtige Geometrie die transparente Geometrie verdecken kann. Was normalerweise getan wird, ist 'Tiefe Schreib' mit glDepthMask (GL_FALSE) deaktivieren, so dass sich transparente Geometrie nicht selbst verschließt. In Ihnen Fall, wie ein Würfel konvex ist, wird es nichts ändern. – rotoglup

+1

Auch müssen Sie transparente Gesichter nach vorne sortieren, da mit Blending aktiviert müssen Sie unvermeidlich einen Painters Algorithmus http://en.wikipedia.org/wiki/Painter_algorithm im Falle von konvexen Formen, wie ein Würfel, es ist einfach : glEnable (GL_CULL_FACE); glCullFace (GL_FRONT); draw_cube_transparent_faces(); glCullFace (GL_BACK); draw_cube_transparent_faces(); - Für den Fall, dass Sie eine korrekte Tiefensortierung implementieren, werden Ihnen Tiefenschreibvorgänge nicht einmal schaden. – datenwolf

+0

Danke! Ich musste hinzufügen, was rotoglup hinzugefügt, um in der Lage zu sein, die "gestapelten" transparenten Gesichter und ein paar mehr Dinge zu sehen, die ich falsch gemacht habe und es funktioniert jetzt gut ... – Matthieu