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.
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
Haben Sie verifiziert, dass GL_BLEND aktiviert ist? –
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