2017-03-23 20 views
2

Ich habe in Opengl eine Weile relativ reibungslos gearbeitet, aber vor kurzem habe ich festgestellt, dass wenn ich ein primitives mit einer transparenten Textur auf meine fbo Textur (benutzerdefinierte Frame-Puffer) rendern macht die fbo Textur transparent an den Pixeln die Textur des Primitivs ist transparent. Das Problem ist, dass hinter dem Primitiven (mit einfarbigen Farben) bereits Dinge stehen, die vor dem Transparenten stehen. Also sollte die fbo-Textur bei diesen Pixeln nicht transparent sein - das Mischen einer festen & transparenten Farbe sollte zu einer festen Farbe führen, nicht wahr?Rendering transparente Textur auf glTexture

Also OpenGL fügt Transparenz zu meiner fbo-Textur hinzu, nur weil das letzte Grundelement transparente Pixel hat, obwohl dahinter bereits feste Farben in die fbo-Textur gezeichnet sind. Sollte die transparente Textur nicht mit den vorhandenen Pixeln der FBO gemischt werden und zu einer Volltonfarbe führen, wenn die fbo-Textur bereits mit Volltonfarben gefüllt ist, bevor das transparente Primitiv gerendert wird?

Was passiert, wenn ich meine fbo Textur auf die Standard-Frame-Puffer rendern, ist, dass die klare Farbe durch Teile davon blutet - wo die zuletzt gezeichnete Textur transparent ist. Aber wenn ich dieselbe Szene direkt auf den Standard-OpenGL-Bildpuffer rendere, sieht die Szene gut aus und die klare Farbe blutet nicht in die transparente Textur.

Noch interessanter ist, dass die glClearColor - Farbe nur dort sichtbar ist, wo das Alpha der Grundstruktur einen Gradienten hat - die klare Farbe hat keinen Einfluss darauf, wo die Textur alpha 1.0 oder 0.0 ist ... ist das ein Fehler? Es scheint die Textur des Primitivs am meisten bei Pixeln mit 0,5 Alpha zu beeinflussen. Wenn Sie dann weiter nach oben oder unten gehen, verringert sich der glClearColor-Einfluss.

Ich weiß, es ist ein bisschen eine komplexe Frage/Situation, ich mein Bestes versucht, ehrlich

zu erklären, ich verwende:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

sowohl die teilweise transparent primitive in die fbo- zu ziehen Textur, und dann die fbo Textur auf den Standard-Framebuffer

Dies ist, was die fbo-Textur in die opengl fbo Standard gezeichnet wie folgt aussieht:

glClearColor ist auf rot gesetzt.

+0

Bevor Sie die Textur der FBO auf den Bildschirm übertragen, erinnern Sie sich, die Überblendung zurückzusetzen? Auch jeder Code oder ein Screenshot davon wäre schön. – Vallentin

+0

Haben Sie verifiziert, dass GL_BLEND aktiviert ist? –

+0

Screenshot hinzugefügt :) Ich möchte das Blending nicht zurücksetzen, weil ich transparente fbo-Texturen haben möchte, das Problem ist, dass die fbo-Textur dort transparent ist, wo sie nicht sein soll, und mit der klaren Farbe des Standards verschmilzt frame buffer – HelloWorldCpp

Antwort

1

Mischen einer festen & transparente Farbe sollte zu einer festen Farbe führen, sollte es nicht?

Nur wenn Ihr Mischmodus es sagt. Und es funktioniert nicht:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Dies gilt den gleichen Mischvorgang auf alle vier Komponenten der Farben. Dies führt dazu, dass das endgültige Alpha das Ergebnis der Multiplikation des Quell-Alphas mit sich selbst ist und dass es zum Ziel-Alpha mal 1-src Alpha addiert wird.

Nun könnte man getrennte Mischung Funktionen für die Farbe und die Alpha verwenden:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); 

Die letzten beiden Parameter die Mischung nur für die alpha angeben, während die ersten beiden die Mischung für die RGB-Farben an.So erhält das Alpha. Separate Blend-Funktionalität ist ab GL 3.x verfügbar, ist aber auch als Erweiterung für ältere Hardware verfügbar.

Aber es scheint mir, dass Sie wahrscheinlich das Alpha überhaupt nicht ändern möchten. So einfach mask alpha writes beim Rendern der Textur:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); 

Vergessen Sie nicht, die Alpha-Maske rückgängig zu machen, wenn Sie wieder es schreiben wollen.

+0

Gelöst! glColorMask hat es geschafft :) Vielen Dank! – HelloWorldCpp

+0

Hey, tut mir leid, dass ich zurück gekommen bin, aber jetzt, wenn ich alle Komponenten der Maske auf "true" setze, nachdem ich das Rendering auf die erste fbo-Textur abgeschlossen habe, und dann versuche, eine andere Ebene (eine zweite fbo-Textur) zu rendern. textur, die transparente quad-texture aus der 1. fbo-textur ist nur dort sichtbar, wo bereits feste farben in der fbo enthalten sind. es funktioniert aber gut für 1 fbo-textur! Irgendeine Idee, wie ich mehrere fbo-Texturen übereinander korrekt rendern könnte? Vielen Dank im Voraus – HelloWorldCpp

+0

Wenn ich glColorMask nicht zurücksetze, wird die unterste Ebene überhaupt nicht gezeichnet – HelloWorldCpp