2012-08-25 20 views
11

Ho problemi con la corruzione delle texture su emulatore Android (funziona bene sulla maggior parte dei dispositivi Android).Corruzione opengl texture Android

Android 4.1 reference rendering

L'immagine qui sopra è un rendering di riferimento prodotta da emulatore di sistema operativo Android 4.1 Jelly Bean, tutto sembra come dovrebbe.

Android 1.6

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)

Android 1.6

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.

+0

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

+0

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

risposta

2
  1. io suggerisco di usare texture a 32 bit, non è in scala di grigi, non "alphamasks" (che cos'è?)
  2. Controllare la dimensione della vostra consistenza, non deve superare la dimensione massima (glGetInteger (GL_MAX_TEXTURE_SIZE). Inoltre facciamo shure tua le trame sono potenti 2. Sì, come hai detto prima, ma se sono in risorse scalabili (cartelle drawable_x_dpi), verranno ridimensionate da Android. Per evitare il ridimensionamento, metterle nella cartella "raw".
  3. Solo per prova, prova a disabilitare tutti i filtri, inclusi mipmaps - imposta GL_TEXTURE_WRAP_S e GL_TEXTURE_WRAP_T a GL_NEAREST
+0

La maschera alfa è una trama con solo canale alfa. Dovrebbero funzionare bene. Tutte le trame sono realmente caricate come potenza di due bitmap (vengono caricate usando 'InputStream', non l'ID risorsa, quindi non vengono ridimensionate). Per quanto riguarda il filtraggio, suppongo che tu intenda "GL_TEXTURE_MIN_FILTER". Impostarlo su 'GL_NEAREST' non risolve il problema. – rkapl

+0

Sì, intendevo GL_TEXTURE_MIN_FILTER. La prossima cosa che puoi provare è quella di sostituire i file di texture che funzionano con le trame che funzionano normalmente. Quindi saprai se il problema è nel caricare la trama o nel modo in cui li usi. – Dave

Problemi correlati