OpenGL Problem

  • Antworten:2
T r
  • Forum-Beiträge: 3

06.08.2012, 22:24:11 via Website

Hallo zusammen,
ich habe mir gerade heute mein neues S3 gekauft.
Da ich für Android programmiere und gerade an einer Augmented Reality App arbeite, ist mir ein Fehler aufgefallen, der mir neu ist.
Zuvor habe ich (mit dem selben Code) an meinem S1 gearbeitet und diese Fehler nicht gehabt.
Das Problem ist einfach:
Ich habe ein Kamerabild und darüber eine OpenGL-ES Szene. Wenn ich dort transparente Pixel habe, sollten diese eigentlich sich mit dem Hintergrundbild er Kamera mischen.
Hier tritt aber jetzt bei dem S3 auf einmal ein Fehler auf. Die hellsten, transparenten Pixel (also nur die, die auch durchscheinen) werden "solarisiert". So ähnlich wie das negative Multiplizieren in Photoshop. Der Fehler ist übrigens nur auf dem Handy zu sehen. Mache ich einen Screenshot, sieht alles perfekt aus!
Dieser Fehler sollte wohl nicht an dem Fragment-Shader liegen. Immerhin clampe ich hier die Farbwerte (auch wenn das vorher nie nötig war).
1gl_FragColor = vec4(clamp(textureColor.rgb * lightWeighting.xyz, 0.0, 1.0), 0.5);
Hat diesen Effekt irgendwer schon mal beobachtet? Zumal die GPU ja die selbe wie im S2 ist und da klappt es. Sind das ggf. irgendwelche der neuen Settings, die ich übersehen habe? Sowas wie den AutoTone (der ist es wohl nicht).
Ich hoffe, irgendwer von euch hat dieses Problem schon einmal beobachtet.
Ich danke euch,
Tobias




Nachtrag:
Ich habe mal ein wenig noch probiert. Wenn ich im BlendModus:
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA_SATURATE, GLES20.GL_ONE);
wähle, werden die Pixel nicht mehr "übersättigt". Damit gehts soweit. Aber trotzdem muss es doch eine möglichkeit geben, das auch ohne quickfix-Dirty-Lösungen hinzubekommen.

— geändert am 06.08.2012, 22:55:35

Antworten
T r
  • Forum-Beiträge: 3

07.08.2012, 14:40:45 via Website

Okay, scheint, als wenn dieses Problem ohnehin nicht bei jedem vorkommen würde.
Vielleicht kann mir jemand, der ein eigenes Galaxy S3 hat helfen.
Ich habe ein kleines Testprogramm geschrieben, was den Fehler reproduziert.
Wenn jemand Lust hat, mir zu helfen, könnt ihr euch den Code hier herunterladen. Vielleicht findet ihr ja meinen Denkfehler:

https://dl.dropbox.com/u/13527005/CameraGLTest.zip

Oder wenn ihr mir helfen wollt aber keine Programmierer seid, dann könnt ihr euch die APK installieren und mir mittelnen, ob es bei euch auch Probleme gibt:

https://dl.dropbox.com/u/13527005/CameraGLTest.apk

Jede Hilfe ist wichtig. Selbst wenn ich erfahre, dass mein Telefon einen Defekt haben sollte. Also lasst es mich wissen, selbst wenn es bei euch klappt!

Vielen Dank,
Tobias

Antworten
T r
  • Forum-Beiträge: 3

08.08.2012, 14:46:58 via Website

Ah, alles klar, ich habe die Lösung.
Das Problem ist die Premultiplikation mit dem Alpha Wert.
Am Einfachsten also ginge es schon damit:

vec3 color = clamp(textureColor.rgb * lightWeighting.xyz, 0.0, 1.0);
color *= 0.5; // premultiply by alpha
gl_FragColor = vec4(color, 0.5);

Auch wenn ich immernoch keine Ahnung habe, weshalb es auf älteren Geräten perfekt funktioniert hat oder weshalb ich das selbe Problem bei Gl1.0 auch habe, wo ich meinen Shader nicht selber schreiben kann.
Trotzdem, für alle, die ähnliche Probleme haben ist das vielleicht die Lösung!
Danke an euch alle!
Tobias

Antworten