2011-07-04 2 views
0

Cela fait quelques semaines que je me bats avec ce problème, sans résultat. Je suis sûr que je manque juste quelque chose de stupide, alors j'ai pensé que j'aurais une opinion extérieure à ce sujet.Dessin de textures translucides sous Android en utilisant OpenGL

Je dessine un tas de textures différentes dans une application, et pour certaines raisons, certaines d'entre elles n'apparaissent pas. J'ai essayé de comprendre pourquoi seulement certaines textures ne s'afficheraient pas, et je pense que je l'ai réduit à des textures avec des pixels translucides (textures qui contiennent des pixels avec une valeur alpha qui n'est pas 0 ou 255). Les textures entièrement opaques s'affichent très bien, et les textures qui ont des pixels entièrement ou complètement désactivés le font également. Les textures de problème s'affichent sous la forme d'un carré blanc. Aussi, je me dis que je devrais ajouter que tout s'affiche bien dans l'émulateur, c'est seulement sur mon appareil de test (Samsung Captivate) que les textures ne s'affichent pas.

Voici quelques extraits de mon code montrant les parties importantes, comme toujours, faites-moi savoir si vous avez besoin de plus d'informations.

Voir la configuration (j'ai essayé ces deux, mais ayant ces lignes semble qu'il y ait ou non faire aucune différence):

gameView.setEGLConfigChooser(8,8,8,8,16,0); 
gameView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 

méthode onSurfaceCreated de Renderer (je l'ai aussi essayé permettant test de profondeur ne en vain, les lignes que j'ai utilisés sont commentées ici, et quand j'ai essayé le test de profondeur, je l'ai fait clair que le tampon de profondeur sur chaque tirage):

gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
gl.glShadeModel(GL10.GL_FLAT); 
gl.glDisable(GL10.GL_DEPTH_TEST); 
//gl.glEnable(GL10.GL_DEPTH_TEST); 
//gl.glDepthFunc(GL10.GL_LEQUAL); 
gl.glEnable(GL10.GL_BLEND); 
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
gl.glEnable(GL10.GL_TEXTURE_2D); 

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

Texture méthode de chargement (pourrait-il avoir quelque chose à voir avec GLUtils.texImage2D?):

int texId; 
gl.glGenTextures(1, mTextureNameWorkspace, 0); 

texId = mTextureNameWorkspace[0]; 
gl.glBindTexture(GL10.GL_TEXTURE_2D, texId); 

if (gl instanceof GL11) { 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE); 
} 
else { 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    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); 

InputStream is = res.openRawResource(resourceId); 
Bitmap bitmap = null; 
try { 
    bitmap = BitmapFactory.decodeStream(is, null, bitmapOptions); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    if (gl instanceof GL11) { 
     mCropWorkspace[0] = 0; 
     mCropWorkspace[1] = bitmap.getHeight(); 
     mCropWorkspace[2] = bitmap.getWidth(); 
     mCropWorkspace[3] = -bitmap.getHeight(); 

     ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); 
    } 

    //Don't poke fun at my archaic error handler 
    int error; 
    String errorCodes = ""; 
    while ((error = gl.glGetError()) != GL10.GL_NO_ERROR) { 
     errorCodes += error + " "; 
    } 
    if (errorCodes.length() != 0) 
     throw new Exception("OpenGL error while loading texture. Error codes: " + errorCodes.substring(0,errorCodes.length()-1)); 

    textureWidth = bitmap.getWidth(); 
    textureHeight = bitmap.getHeight(); 
    textureId = texId; 

    return texId; 
} 
finally { 
    try { is.close();  } catch (IOException e) { } 
    try { bitmap.recycle(); } catch (Exception e) { } 
} 
+0

Dans quelles dimensions sont vos textures? – Wroclai

+0

C'est un jeu 2D basé sur des tuiles. C'est ce que vous vouliez dire? – Klazen108

+0

Njah. Dans quelles dimensions sont vos textures que vous ne pouviez pas afficher? 32x32, 64x64 ou 128x128? – Wroclai

Répondre

2

Juste pour fermer la question au cas où quelqu'un trébuche sur elle:

Cette erreur se produisait parce que les images ont été enregistrées dans res/drawable. Une fois chargé à partir de là, l'Android peut effectuer un traitement en coulisse, ce qui fait que les images obtenues ne sont pas dimensionnées à une puissance de deux. Stockez les images dans res/raw pour éviter ce traitement.