2010-05-19 3 views
2

Salut Je développe un jeu pour Android en utilisant OpenGL es et ont frappé un problème:Textures PNG ne se charge pas sur HTC désir

Mes charges de jeu fines dans l'émulateur (windows xp et vista depuis Eclipse), il a également se charge bien sur un T-Mobile G2 (HTC Hero) mais quand je le charge sur mon nouveau HTC Desire aucune des textures ne semble se charger correctement (ou pas du tout). Je suspecte la méthode BitmapFactory.decode bien que je n'ai aucune preuve que c'est le problème. Toutes mes textures ont une puissance de 2 et les textures JPG semblent se charger (bien qu'elles ne soient pas d'une grande qualité) mais tout ce qui est GIF ou PNG ne se charge pas du tout sauf pour un carré rouge 2x2 qui charge fine et une texture qui correspond à un objet 3D mais qui semble remplir chaque triangle du mesh avec la couleur la plus proche).

Ceci est mon code pour le chargement des images:

 AssetManager am = androidContext.getAssets(); 
    BufferedInputStream is = null; 
    try { 
    is = new BufferedInputStream(am.open(fileName)); 

    Bitmap bitmap; 

    bitmap = BitmapFactory.decodeStream(is); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
    bitmap.recycle(); 
    } catch(IOException e) { 
    Logger.global.log(Level.SEVERE, e.getLocalizedMessage()); 
    } finally { 
    try { 
     is.close(); 
    } catch(Exception e) { 
     // Ignore. 
    } 
    } 

grâce

Répondre

1

J'ai le même problème. Pour moi - cela ne se produit que lorsque le png a de la transparence. Tout a commencé à se produire lorsque je suis passé à la version 2.2. Avant que les textures fonctionnent bien, même si elles n'étaient pas la puissance de 2.

Mais maintenant c'est totalement aléatoire. Je crée un fichier png dans GIMP avec backgroud transparent. A dessiné quelques lignes avec le pinceau et il montre noir dans l'application Android. Ensuite, je l'ai édité, ajouté 3 lignes de plus et il se charge bien. Ensuite, j'ai fait quelques modifications supplémentaires et il ne sera pas rendu à nouveau: S.

J'ai testé dans un exemple d'application pour exclure mes erreurs de codage (http://insanitydesign.com/wp/projects/nehe-android-ports/ - l'exemple de fusion), juste changé la fonction de mélange à mes besoins.

Il se comporte exactement comme mon application.

Est-ce que quelqu'un a trouvé une solution de contournement quelconque?

+0

une solution consiste à utiliser Bitmap.createScaledBitmap à «l'échelle du bitmap à la même taille exacte. Cela le rend souvent plus heureux. –

0

La taille est vraiment l'importation de la texture, par exemple j'ai utilisé un rectangle comme un argument pour BitmapFactory.decodeStream de 0, 0, 1024, 1024. Bien sûr, il devait être 0, 0, 1023, 1023. Pour un regard refference le code ci-dessous, je l'ai testé sur le Desire S et Galaxy S2:

InputStream is = context.getResources().openRawResource(resource); 
    Bitmap bmp; 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, texID[tex]); 

    // Mendatory, tells openGL how to render the texture, nearest will look sharp, smooth will look blurry 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 

    // Not mendatory, tells openGL what to do when sprite is smaller or bigger than object 
    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.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    try { 
     BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options(); 
     // Set our bitmaps to 16-bit, 565 format...uhm, this looks more like 32 bit: 8888 
     sBitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     bmp = BitmapFactory.decodeStream(is, new Rect(0, 0, 1023, 1023), sBitmapOptions); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); 
     bmp.recycle(); 
    } finally { 
     try { 
      is.close(); 
     } catch(IOException e) { 
      // Ignore. 
     } 
    } 
Questions connexes