Wie mache ich eine Textur teilweise transparent?

13

Guten Morgen StackOverflow, ich habe gerade ein kleines Problem, da ich keine Möglichkeit finde, einen Teil einer Textur mit openGL transparent zu rendern.

Hier ist meine Einstellung: Ich habe ein Quad, das eine Wand darstellt und mit dieser Textur bedeckt ist (zum Hochladen in PNG konvertiert). Natürlich möchte ich, dass die Wand bis auf die Glasscheiben undurchsichtig ist. Hinter der Mauer befindet sich ein weiteres Flugzeug, das eine Landschaft zeigen soll. Ich möchte die Landschaft hinter dem Fenster sehen. Jede Textur ist eine TGA mit Alpha-Kanal.

Die "Landschaft" wird zuerst gerendert, dann die Wand. Ich dachte, es würde ausreichen, um diesen Effekt zu erzielen, aber anscheinend ist das nicht der Fall. Der Teil des Fensters, der transparent sein soll, ist schwarz und die Landschaft erscheint nur, wenn ich an der Wand vorbeigehe.

Ich habe versucht, mit GLBlendFunc () zu fummeln, nachdem ich es aktiviert habe, aber es scheint den Trick nicht zu tun.

Vergesse ich einen wichtigen Schritt?

Vielen Dank :)

Megamoustache
quelle
Hallo, willkommen bei gdse. Ich habe nur wenige Änderungen vorgenommen. Wir mögen es nicht, Tags in Überschriften von Fragen zu platzieren (insbesondere, wenn Sie dasselbe Tag in Tags verwenden :)). Und zu deiner Frage. Verwenden Sie eine feste Pipeline oder eigene Shader?
Notabene
Vielen Dank für die Bearbeitung. Ich bin mir nicht sicher, was "feste Pipeline" bedeutet, aber ich erstelle jeden Vertex manuell und verwende keinen Shader. Wenn das wichtig ist, verwende ich nicht die letzte Version von openGL, da dies für Schulaufgaben gedacht ist (ich denke, es ist openGL 3).
Megamoustache
Es wäre toll, wenn Sie das Bild in Ihre Frage aufnehmen könnten. Es scheint von seinem ursprünglichen Standort verschwunden zu sein.
ODER Mapper

Antworten:

19

Zusätzlich zu allem, was Sie angegeben haben (Texturen mit Alphakanälen, Zeichnen der Landschaft vor dem Zeichnen der Wand + des Fensters), müssen Sie noch zwei weitere Schritte ausführen.

Zunächst müssen Sie die Mischfunktionen von OpenGL aktivieren:

glEnable(GL_BLEND);

Zweitens müssen Sie OpenGL mitteilen, wie die Farben gemischter Pixel berechnet werden sollen (was OpenGL übrigens "Fragmente" nennt). In diesem Fall ist etwas Einfaches in Ordnung:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Sobald das Mischen aktiviert ist, kombiniert OpenGL die Pixelfarben gemäß den Funktionsparametern, die Sie in glBlendFunc angeben. Insbesondere wird "source.color * source.alpha + destination.color * (1-source.alpha)" ausgeführt, wobei "source" die Textur ist, die Sie gerade rendern, und "destination" die Farbe ist, die bereits in der Framebuffer (die Landschaft). Wo immer Ihr Alphakanal weiß ist, erhalten Sie die Wandfarbe, und wo immer der Alphakanal schwarz ist, erhalten Sie die Querformatfarbe. Wenn der Alphakanal grau ist, erhalten Sie eine Überblendung zwischen den beiden Farben.

Wenn Ihr Fenster vollständig transparent ist, gibt es andere Möglichkeiten, um dies zu tun. Dabei ist die Reihenfolge, in der Sie die beiden Polygone zeichnen, nicht wichtig, aber dies führt zu fortgeschritteneren Konzepten wie Alpha-Schwellenwerten. Wird für Ihre aktuelle Situation wahrscheinlich nicht benötigt.

Trevor Powell
quelle