Ho problemi con la corruzione delle texture su emulatore Android (funziona bene sulla maggior parte dei dispositivi Android).Corruzione opengl texture Android
L'immagine qui sopra è un rendering di riferimento prodotta da emulatore di sistema operativo Android 4.1 Jelly Bean, tutto sembra come dovrebbe.
La seconda immagine viene catturata in emulatore di sistema operativo Android 1.6. Si noti la corruzione di alcuni dei pulsanti della barra degli strumenti con disabilità (che sono resi con 1F colore, 1f, 1f, 0.5f)
La terza immagine è catturata nella stessa emulatore. La differenza è che ora il punteggio viene visualizzato nell'angolo in alto a destra. Il punteggio è un font bitmap, la texture è una maschera alfa. Tutto reso dopo che la partitura perde è la sua trama. Si noti che lo screenshot precedente conteneva anche il font bitmap reso allo stesso modo (ma usando una texture diversa).
Un problema simile era presente su uno dei dispositivi Samsung (non ricordo il modello). Quando la texture del pavimento è stata renderizzata, tutto viene reso dopo la texture persa. Il problema non si è manifestato quando io a) non legavo la trama b) legavo la trama, ma non disegnavo triangoli con essa c) ricreavo la risorsa png da zero.
Impostazioni 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);
Come texture vengono caricati:
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;
}
}
Note: il tipo di carattere è resa utilizzando gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
e GL10.glDrawArrays
. La corruzione non riguarda solo l'emulatore 1.6, ma anche la serie 2.x di Android, anche se non è così prominente (le maschere alfa sono ancora rese in modo errato). Tutte le risorse vengono caricate correttamente come potenza di due bitmap.
Le trame sono la potenza di due? e usi superPng o Png? i normali file png non si riservano correttamente alfa come maschera. ma superPng può prenotarlo. Esiste un plugin per Photoshop da esportare come superPng – Behnam
Sì, sono tutti Power of Two (menzionati alla fine del post). Le immagini bitmap sono memorizzate come bitmap in scala di grigi, caricate come ARGB_8888 da Android e convertite in maschera alfa dal mio codice. – rkapl