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
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.
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)
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.
¿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
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