2010-12-29 9 views
2

Ich habe jetzt mehr als einen Tag investiert, um eine Lösung zu finden, wie man transparente Texturen mit OpenGL auf Android rendern kann. Offensichtlich hatten andere mehr Glück als ich, aber nachdem ich verschiedene Lösungen (z. B. Transparent texture in OpenGL ES for Android) ausprobiert habe, kann ich es immer noch nicht schaffen.Probleme beim Anzeigen von transparenten Texturen mit OpenGL ES auf Android

Hier ist meine Grundeinstellung:

 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glDisable(GL10.GL_LIGHTING); 

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, 
      GL10.GL_MODULATE); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glViewport(0, 0, w, h); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, -ratio, ratio, -1, 1); 

Die Texturen über ...

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
      GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
      GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
      GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
      GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, 
      GL10.GL_MODULATE); 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

geladen werden ... und es gibt Hinweise darauf, dass dies zu Problemen aufgrund führt alpha vormultipliziert . Aber ReplicaIsland verwendet auch die GLUtils-Funktion und das Spiel scheint keine Probleme mit transparenten Bildern zu haben.

Jetzt, wenn ich Texturen mit Alpha-Kanal (PNG) zeichnen, erscheinen sie solide schwarz. Texturen ohne Alpha werden in ihrer jeweiligen Farbe korrekt gezeichnet). Ich bewarb mich verschiedene glBlendFunc ohne Glück nennt, heißt

gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 

Ich habe auch dieses ein ein

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

Das Ergebnis versuchen immer, dass die Texturen überhaupt nicht sichtbar sind (vollständig transparent?).

Bilder zum Testen werden vom ReplicaIsland-Projekt verwendet, dies sind Standard-PNGs. Dies bedeutet auch, dass die verwendeten Texturen der Power-of-2-Regel entsprechen - eine weitere Lösung, die in verschiedenen Posts angeboten wird. Ich sehe einen Unterschied darin, dass ReplicaIsland hauptsächlich auf die draw_texture-Erweiterung angewiesen ist, während ich VBOs verwenden muss (um Rotationen anwenden zu können).

Hilfe würde sehr geschätzt werden! Danke Ben

Antwort

2

Ok, ein weiterer Tag des Debuggen geht vorbei und endlich habe ich meinen Fehler gefunden. Es hatte nichts mit dem Farbschema der Bitmap zu tun, glBlendFunc oder so ähnlich.

Ich entpuppte sich als eine schlampige Verwendung von GL_FIXED und GL_FLOAT in zwei Texturfunktionsaufrufen.

Verwandte Themen