Was würde OpenGL Alpha Blending Unterschiede zwischen Windows und OS X verursachen?

9

Es gibt 3 Hintergründe im unteren Bild: schwarz weiß & amp; grau

Es gibt 3 Balken auf jedem: schwarz - & gt; transparent, weiß - & gt; transparent und Farben - & gt; transparent

Ich verwende glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); und alle meine Eckpunktfarben sind 1,1,1,0.

Der Defekt ist wirklich im Weiß- & gt; transparent auf weißem Hintergrund sichtbar.

Unter Windows XP (und anderen Windows-Flavors) funktioniert es perfekt und ich werde komplett weiß. Auf dem Mac werde ich jedoch grau in der Mitte!

Was würde das verursachen, und warum würde es dunkler werden, wenn ich Weiß auf Weiß mische?

Der Screenshot in voller Größe ist @ Ссылка

Aktualisierte Information:

Unter Windows scheint die OpenGL-Version keine Rolle zu spielen. 2.0 bis 3.2, alle arbeiten. Auf dem Mac habe ich jetzt vor mir, es ist 2.1.

Die Gradienten wurden in Texturen gehalten, und alle Ecken sind mit 1,1,1,1 (weißes RGB, volles Alpha) gefärbt. Die Hintergründe sind nur 1x1 Pixel Texturen (atlas mit den Gradienten) und die Scheitelpunkte sind wie benötigt, mit voller Alpha gefärbt.

Der Atlas wird mit glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data); erstellt. Er kommt von einer ARGB-dds-Datei, die ich selbst erstellt habe.

Ich sollte auch beachten, dass alles mit einem einfachen Shader gezeichnet wird:

%Vor%

Die Alpha-Uniform wird auf 1.0

gesetzt

Nun, ich habe versucht, es zu ändern, so dass der weiße Farbverlauf keine Textur war, sondern nur vier Ecken, wo die linken fest und undurchsichtig waren und die rechten 1,1,1,0, und das funktionierte !

Ich habe die Textur jetzt dreifach überprüft, und sie ist nur weiß, mit variierenden Alpha 1,0- & gt; 0,0.

Ich denke, das könnte ein Standardproblem sein. Die Version von opengl oder der Treiber können die Dinge anders initialisieren.

Zum Beispiel habe ich kürzlich herausgefunden, dass GL_TEXTURE_2D standardmäßig glEnabled ist, aber nicht der Intel GME965.

LÖSUNG GEFUNDEN

Zuerst ein bisschen mehr Hintergrund. Dieses Programm ist eigentlich in .NET geschrieben (mit Mono unter OS X), und die DDS-Datei, die ich schreibe, ist ein Atlas, der automatisch durch Komprimieren eines Verzeichnisses von 24-Bit-PNG-Dateien in die kleinste Textur generiert wird. Ich lade diese PNGs mit System.Drawing.Bitmap und rendere sie in eine größere Bitmap nach dem Bestimmen des Layouts. Dieses Post-Layout-Bitmap wird dann gesperrt (um es auf seine Bytes zu bekommen), und diese werden durch den Code, den ich geschrieben habe, in einen DDS geschrieben.

Nachdem ich Bahbars Rat gelesen hatte, überprüfte ich die Texturen im Speicher und sie waren tatsächlich anders! Mein geladener DDS scheint der Übeltäter zu sein und keine OpenGL-Einstellungen. Heute habe ich die DDS-Datei auf den beiden Plattformen ausgecheckt (mit einem Byte-für-Byte-Vergleich), und tatsächlich waren sie anders! Wenn ich die DDS-Dateien mit WTV ( Ссылка ) lade, sahen sie identisch aus. Mit WTV können Sie jedoch jeden Kanal ausschalten (R G B A). Als ich den Alpha-Kanal ausgeschaltet habe, sah ich unter Windows ein wirklich schlecht aussehendes Bild. Kein Alpha würde zu Kanten ohne Antialiasing führen, also würde es natürlich schrecklich aussehen. Als ich den Alpha-Kanal auf dem OSX DDS ausgeschaltet habe, sah es gut aus!

Der PNG-Loader in Mono ist ein Multiplikator, der alle meine Probleme verursacht. Ich habe ein Ticket für sie eingegeben ( Ссылка ) und habe direkt zu libpng gewechselt.

Danke allen!

    
Danny Dulai 11.02.2011, 06:02
quelle

2 Antworten

1

Überprüfen Sie Ihren dds loader. Es könnte die Vormultiplikation sein, von der John Bartholomew über die Last sprach, nur auf einer Plattform.

Eine einfache Möglichkeit zur Überprüfung besteht auch darin, die Daten beim GlTexImage-Aufruf zu betrachten, während sie in die Textur geladen werden. Sind diese Daten vollständig einheitlich?

    
Bahbar 16.02.2011, 10:33
quelle
2

Dies ist ein bisschen ein Stich im Dunkeln, aber überprüfen Sie (oder setzen Sie explizit) die Pixel-Transfer-Modi.

Die Ausgabe, die Sie erhalten, sieht aus wie die Ergebnisse, die Sie erwarten würden, wenn Sie Texturen mit vormultipliziertem Alpha verwenden würden, aber dann den von Ihnen eingestellten Mischmodus verwenden würden. Etwas könnte die Pixelübertragungsmodi eingerichtet haben, um beim Laden von Texturen Alpha in die Farbkanäle zu multiplizieren.

Sie können auch überprüfen, ob das Mac-Ergebnis korrekt ist (mit Texturen), wenn Sie den Mischmodus auf glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) setzen.

    
John Bartholomew 11.02.2011 20:43
quelle

Tags und Links