2012-08-25 25 views
11

Estoy teniendo problemas con la corrupción de textura en el emulador de Android (funciona bien en la mayoría de los dispositivos Android).Android opengl textura corrupción

Android 4.1 reference rendering

La imagen de arriba es una representación de referencia producida por el emulador con Android 4.1 Jelly Bean, todo se ve como debería.

Android 1.6

La segunda imagen es capturada en el emulador con Android 1.6. Tenga en cuenta la corrupción de algunos de los botones de la barra de movilidad reducida (que se representan con el color 1f, 1f, 1f, 0.5f)

Android 1.6

La tercera imagen es capturada en el mismo emulador. La diferencia es que ahora la puntuación se representa en la esquina superior derecha. La puntuación es una fuente de mapa de bits, su textura es una máscara alfa. Todo rendido después de que el puntaje pierde su textura. Tenga en cuenta que la captura de pantalla anterior también contenía una fuente de mapa de bits procesada de la misma manera (pero con diferente textura).

Un problema similar estaba presente en uno de los dispositivos de Samsung (no recuerdo el modelo). Cuando se procesó la textura del piso, todo se procesó después de esa textura perdida. El problema no se manifestó cuando yo a) no uní la textura b) sí se vinculó la textura, pero no dibujé triángulos con ella c) recreé el activo png desde cero.

Configuración de 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); 

¿Cómo se cargan las texturas:

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; 
    } 
} 

Notas: el tipo de letra se representa mediante gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); y GL10.glDrawArrays. La corrupción afecta no solo al emulador 1.6, sino también a la serie 2.x de Android, aunque no es tan prominente (las máscaras alfa todavía se representan incorrectamente). Todos los activos se cargan correctamente como potencia de dos mapas de bits.

+0

¿Las texturas son la dimensión Poder de dos? y usas superPng o Png? los archivos png normales no reservan alfa correctamente como máscara. pero superPng puede reservarlo. Existe un complemento para photoshop para exportar como superPng – Behnam

+0

Sí, todos son Power of Two (mencionados al final de la publicación). Los mapas de bits se almacenan como mapas de bits en escala de grises, se cargan como ARGB_8888 por android y mi código los convierte en máscara alfa. – rkapl

Respuesta

2
  1. Sugiero el uso de texturas de 32 bits, no en escala de grises, no "alphamasks" (Que es esto?)
  2. comprobar el tamaño de su textura, que no debe exceder el máximo (glGetInteger (GL_MAX_TEXTURE_SIZE). También hacen shure su las texturas tienen una potencia de 2. Sí, lo mencionó antes, pero si están en activos escalables (drawable_x_dpi folders), se escalarán a través de Android. Para evitar escalar, colóquelas en la carpeta "raw"
  3. Solo para prueba, intente desactivar todo el filtrado, incluidos los mipmaps: configure GL_TEXTURE_WRAP_S y GL_TEXTURE_WRAP_T en GL_NEAREST
+0

La máscara alfa es una textura con solo canal alfa. Deberían funcionar bien. Todas las texturas se cargan realmente como potencia de dos mapas de bits (se cargan usando 'InputStream', no id de recurso, por lo que no se escalan). En cuanto al filtrado, supongo que querías decir 'GL_TEXTURE_MIN_FILTER'. Configurarlo en 'GL_NEAREST' no soluciona el problema. – rkapl

+0

Sí, me refiero a GL_TEXTURE_MIN_FILTER. Lo siguiente que puedes intentar es reemplazar los archivos de textura que fallan con texturas que funcionan normalmente. Entonces sabrá si el problema está en la carga de texturas o en la forma en que las usa. – Dave

Cuestiones relacionadas