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
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.
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)
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.
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
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