Ich habe ein LibGDX-Spiel mit Cartoon-Wolken mit einem glatten Farbverlauf. Es gibt andere Beispiele für Farbverläufe im Spiel, die ein ähnliches Problem haben, aber die Wolken sind das offensichtlichste Beispiel. Sie sehen gut aus in Android, auf iOS und auf der Desktop-Version des Spiels, aber in der WebGL-Version werden die Farbverläufe nicht so glatt gezeichnet. Es scheint nur Alpha-Gradienten zu sein, die das Problem haben. Andere Farbverläufe sehen gut aus.Alpha-Gradienten nicht glatt in WebGL bei Verwendung von Multi-Multiplikator Alpha
Ich habe auf 3 verschiedenen Geräten in Chrome und IE versucht, und alle 3 produzieren die gleichen Ergebnisse. Einen Test der HTML5-Version finden Sie hier.
https://wordbuzzhtml5.appspot.com/canvas/
Ich habe ein Beispiel IntelliJ Projekt auf GitHub hier
https://github.com/WillCalderwood/CloudTest
hinzugefügtWenn Sie IntelliJ haben, dieses Projekt klonen, öffnen Sie die Datei build.gradle, drücken Sie Alt-F12, geben Sie gradlew html:superdev
und wechseln Sie dann zu http://localhost:8080/html/
Der kritische Code render()
here
Das untere Bild hier ist die Desktop-Version, die obere ist die WebGL-Version, beide laufen auf der gleichen Hardware.
Es gibt nichts, klug mit der Zeichnung geht. Es ist nur ein Aufruf an
spriteBatch.draw(texture, getLeft(), getBottom(), getWidth(), getHeight());
Ich bin mit den Standard-Shader, mit integrierten Alpha verpackt Texturen mit der Funktion Mischung eingestellt als
spriteBatch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
Dies ist das aktuelle Bild, obwohl alpha nicht Premultiplied wie das ist, getan von meinem Packer.
Kennt jemand einen möglichen Grund dafür und wie könnte ich es beheben?
aktualisieren
Dies erscheint nur, wenn Sie die Füllmethode GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
Ein weiteres Update
ich versucht, mit passieren haben das ganze Spiel zu ändern Alpha Texturen verwenden nicht-premultiplied. Ich benutze den Texture Packer, der helfen kann, die Halo-Probleme zu beheben, die oft bei nicht-multipliziertem Alpha auftreten. All dies funktioniert in der Android- und Desktop-Version. In der WebGL-Version bekomme ich, während ich weiche Gradienten bekomme, immer noch einen kleinen Halo-Effekt, also kann ich das auch nicht als Lösung verwenden.
Und noch ein Update
Hier ist ein neues Bild. Desktop-Version oben, Web-Version unten.Mischmodus GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
auf der linken Seite und GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA
auf der rechten
Hier ist eine vergrößerte Version des unteren linken Bild oben mit erhöhtem Kontrast um das Problem zu zeigen.
Ich habe auch eine Menge zu spielen mit dem Fragment-Shader, um zu versuchen und herauszufinden, getan, was passiert. Wenn ich
gesetztgl_FragColor = vec4(c.a, c.a, c.a, 1.0);
dann ist die Steigung glatt, aber wenn ich gesetzt
gl_FragColor = vec4(c.r, c.r, c.r, 1.0);
Dann bekommen Banding ich. Dies deutet auf ein Genauigkeitsproblem hin, da die Farbkanäle durch den Vormultiplikationsprozess in das dunklere Ende des Spektrums gedrückt wurden.
Welches Texturformat verwenden Sie und was ist Ihr Frambuffer-Format? RGBA8 unkomprimiert? – solidpixel
@ Isogen74 Ja, RGBA8 unkomprimiert. –
Bist du sicher, dass das Ziel Alpha 1 ist? webgl wird mit dem Seitenhintergrund als primult alpha zusammengesetzt. Um klar zu sein, löschen Sie Alpha vor dem Blit. – starmole