2012-08-25 3 views
11

Je rencontre des problèmes de corruption de texture sur l'émulateur Android (il fonctionne bien sur la plupart des appareils Android).Corruption de texture opengl Android

Android 4.1 reference rendering

L'image ci-dessus est un rendu de référence produit par émulateur fonctionnant sous Android 4.1 Jelly Bean, tout a l'air comme il se doit.

Android 1.6

La seconde image est capturée dans l'émulateur exécutant les applications 1.6. Notez la corruption de certains boutons de la barre d'outils handicapés (ils sont rendus avec 1f couleur, 1f, 1f, 0.5f)

Android 1.6

La troisième photo est capturée dans le même émulateur. La différence est que maintenant le score est rendu dans le coin supérieur droit. Score est une police bitmap, sa texture est un masque alpha. Tout ce qui est rendu après le score perd sa texture. Notez que la capture d'écran précédente contenait également la police bitmap rendue de la même manière (mais en utilisant une texture différente).

Un problème similaire était présent sur l'un des appareils Samsung (je ne me souviens pas du modèle). Lorsque la texture du sol a été rendue, tout est rendu après cette texture perdue. Le problème ne s'est pas manifesté lorsque j'ai soit) n'a pas lié la texture b) ai lié la texture, mais n'a pas dessiné de triangles en l'utilisant c) a recréé l'actif png à partir de rien.

paramètres Opengl:

gl.glDisable(GL10.GL_LIGHTING); 
gl.glDisable(GL10.GL_CULL_FACE); 
gl.glDisable(GL10.GL_DEPTH_TEST); 
gl.glDisable(GL10.GL_DITHER); 
gl.glDepthMask(false); 
gl.glEnable(GL10.GL_TEXTURE_2D); 
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA); 
gl.glShadeModel(GL10.GL_FLAT); 
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 

Comment les textures sont chargées:

public void doGLLoading(Engine renderer) { 
     GL10 gl=renderer.getGl(); 
     int[] ids=new int[1]; 
     gl.glGenTextures(1, ids,0); 
     id=ids[0]; 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, id); 
     Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString())); 
     buildMipmap(gl, bitmap); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT); 
    } 
private void buildMipmap(GL10 gl, Bitmap bitmap) { 
    int level = 0; 
    int height = bitmap.getHeight(); 
    int width = bitmap.getWidth(); 

    while (height >= 1 || width >= 1) { 
     // First of all, generate the texture from our bitmap and set it to 
     // the according level 
        //TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0); 
     if (height == 1 || width == 1) { 
      break; 
     } 
     // Increase the mipmap level 
     level++; 
     height /= 2; 
     width /= 2; 
     Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height, 
       true); 

     // Clean up 
     bitmap.recycle(); 
     bitmap = bitmap2; 
    } 
} 

Notes: la police est rendu à l'aide gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); et GL10.glDrawArrays. La corruption affecte non seulement l'émulateur 1.6, mais aussi la série 2.x d'android, bien qu'il ne soit pas aussi important (les masques alpha sont toujours rendus incorrectement). Tous les actifs sont correctement chargés en tant que puissance de deux bitmaps.

+0

Les textures sont-elles dimensionnées Power of Two? et utilisez-vous superPng ou Png? Les fichiers png normaux ne réservent pas alpha correctement en tant que masque. mais superPng peut le réserver. Un plugin pour photoshop existe pour exporter en superPng – Behnam

+0

Oui, ils sont tous Power of Two (mentionné à la fin du post). Les bitmaps sont stockés sous forme de bitmaps en niveaux de gris, chargés comme ARGB_8888 par android, et convertis en masque alpha par mon code. – rkapl

Répondre

2
  1. Je suggère d'utiliser des textures 32 bits, et non en niveaux de gris, pas "alphamasks" (ce qui est-ce?)
  2. Vérifiez la taille de votre texture, il ne doit pas dépasser la taille maximale (glGetInteger (GL_MAX_TEXTURE_SIZE). Assurez-vous également shure votre les textures sont la puissance de 2. Oui, vous avez mentionné avant qu'elles ne le soient, mais si elles sont dans des actifs évolutifs (dossiers drawable_x_dpi), elles seront mises à l'échelle par android.Pour éviter la mise à l'échelle, placez-les dans le dossier "raw"
  3. test, essayez de désactiver tout le filtrage, y compris les mipmaps - définir GL_TEXTURE_WRAP_S, et GL_TEXTURE_WRAP_T à GL_NEAREST
+0

Le masque Alpha est une texture avec uniquement un canal alpha. Ils devraient bien fonctionner. Toutes les textures sont réellement chargées en tant que puissance de deux bitmaps (elles sont chargées en utilisant 'InputStream', pas l'identifiant de ressource, donc elles ne sont pas mises à l'échelle). En ce qui concerne le filtrage, je suppose que vous vouliez dire "GL_TEXTURE_MIN_FILTER". La définition de 'GL_NEAREST' ne résout pas le problème. – rkapl

+0

Oui, je voulais dire GL_TEXTURE_MIN_FILTER. La prochaine chose que vous pouvez essayer est de remplacer les fichiers de texture qui glitch avec des textures qui fonctionnent normalement. Ainsi vous saurez si le problème est dans le chargement de la texture ou dans la façon dont vous les utilisez. – Dave