Android OpenGL ES 2:不使用ARGB8888时mipmap中的垃圾

时间:2014-07-05 12:46:10

标签: android opengl-es textures opengl-es-2.0 mipmaps

我的源图像是512x512 jpegs。设备是Galaxy Tab 2。

使用下面的代码(解码为32位)时,我的mipmap生成完美:

globalBmp = Bitmap.createBitmap(512, 512, Config.ARGB_8888);
...
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();                             
bmpOptions.inBitmap = globalBmp;                            
bmpOptions.inSampleSize = 1;                                                                                                                                    
Bitmap b = BitmapFactory.decodeStream(fileStream, null, bmpOptions);
...
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);        

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);        
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap, GLES20.GL_UNSIGNED_BYTE, 0);                                    

GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

Level 2 Mipmap, Perfect
但是,为了将内存使用量保持在最低限度,我宁愿将图像加载为16位。 RGB_565最有意义,因为没有alpha信息。我尝试通过更改以下行来做到这一点:

globalBmp = Bitmap.createBitmap(512, 512, Config.RGB_565);
...
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, bitmap, GLES20.GL_UNSIGNED_SHORT_5_6_5, 0);

使用565会在1级以后产生这个令人讨厌的mipmap。 0级仍然是完美的。 RGB565 Level1

最后一件事。如果我将滤镜模式线移动到mipmap生成之后,mipmap没有红色调,但它们看起来也不正确。

GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);        

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, bitmap, GLES20.GL_UNSIGNED_SHORT_5_6_5, 0);                                  

GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);        
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

weird

此外,如果我使用Config.ARGB_4444GLES20.GL_UNSIGNED_SHORT_5_6_5,红色调会变黄,并且看起来不那么糟糕:

ARGB_4444 Level1

请!有人说明了为什么会发生这种情况

1 个答案:

答案 0 :(得分:0)

似乎是特定于设备的。所以我总是使用ARGB8888来保证安全。可惜,因为它会大大减少内存占用。