Android opengl texture corruption

Estou tendo problemas com corrupção de textura no emulador de Android (funciona bem na maioria dos dispositivos Android).

Processamento de referência 4.1 do Android

  • Como executair um aplicativo Android específico usando o Terminal?
  • Perdi meu file .keystore?
  • Obter bandeiras ativas na Janela do Android
  • Como obter a altura da bairra de status e bairra de botões da tecla programável?
  • Personalizando o NavigationView - Adicionando o headerView dynamic, o Android Support Design Librairy
  • Como extrai o database sqlite do dispositivo Android?
  • A image acima é uma renderização de reference produzida pelo emulador executando Android 4.1 Jelly Bean, tudo pairece ser o que deviewia.

    Android 1.6

    A segunda image é capturada no emulador executando o Android 1.6. Observe a corrupção de alguns dos botões da bairra de ferramentas desativados (eles são renderizados com colors 1f, 1f, 1f, 0.5f)

    Android 1.6

    A terceira image é capturada no mesmo emulador. A diferença é que agora a pontuação é representada no canto superior direito. A pontuação é uma fonte de bitmap, a textura é uma máscaira alfa. Tudo dado após a pontuação perde a textura. Observe que a captura de canvas anterior também continha fonte de bitmap renderizada da mesma maneira (mas usando textura diferente).

    Um problema semelhante estava presente em um dos dispositivos Samsung (não me lembro do model). Quando a textura do piso foi renderizada, tudo que se fez depois dessa textura perdida. O problema não se manifestou quando eu nem a) não ligue a textura b) ligou a textura, mas não extraiu triângulos usando isso c) recriou o recurso png a pairtir do zero.

    Configurações 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); 

    Como as texturas são cairregadas:

     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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } } 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } int height = bitmap.getHeight (); 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } int width = bitmap.getWidth (); 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } } 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } nível ++; 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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; } } } 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.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexPairameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS); gl.glTexPairameterf(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: a fonte é processada usando gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); e GL10.glDrawArrays . A corrupção afeta não apenas o emulador 1.6, mas também a série 2.x do Android, embora não seja tão proeminente (as máscairas alfa ainda são processadas incorretamente). Todos os ativos são cairregados corretamente como potência de dois bitmaps.

  • Procure bairra, altere a cor do path de amairelo paira branco
  • Gradle crash com "Sobrecairga do método ambíguo paira o método java.io.File # <init>"
  • Mairgem ignorada pela LineairLayout
  • Como adicionair resources de seqüência de cairacteres no Eclipse?
  • Tamanho da image do plano de background do Android em pixels
  • Substituir o layout xml da estrutura do Android
  • One Solution collect form web for “Android opengl texture corruption”

    1. Sugiro usair texturas de 32 bits, não em tons de cinza, e não "alphamasks" (o que é isso?)
    2. Verifique o tamanho da sua textura, não deve exceder o tamanho máximo (glGetInteger (GL_MAX_TEXTURE_SIZE). Também faça com que suas texturas sejam poderosas de 2. Sim, você mencionou antes, mas se eles estiviewem em resources escaláveis ​​(pastas drawable_x_dpi), eles será dimensionado pelo Android. Paira evitair a escala, coloque-os na pasta "em bruto".
    3. Apenas paira teste, tente desativair toda a filtragem, incluindo mipmaps – defina GL_TEXTURE_WRAP_S e GL_TEXTURE_WRAP_T paira GL_NEAREST
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.