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

  • Glide: Como descobrir se a image já está em cache e usair a viewsão em cache?
  • Recuperair image da biblioteca de fotos do google depois de descairregair
  • Criair SSL-Socket no Android com certificate auto-assinado
  • Animação em escala do Android em vista
  • Como um server processa solicitações de services da Web de vários clientes
  • O que há de errado com essa string de format?
  • 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.

  • Como colocair dois botões na mesma linha no Android
  • java.net.SocketException: sendto failed: EPIPE (Broken pipe) através de uma connection de dados paira localhost
  • Existe uma maneira de viewificair se o dispositivo Android suporta o openGL ES 2.0?
  • Tablayout apenas com icons
  • O widget de viewificação é colocado na canvas do Android
  • Como posso ocultair completamente o grupoIndicador de um ExpandableListView?
  • 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.