我的源图像是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);
但是,为了将内存使用量保持在最低限度,我宁愿将图像加载为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级仍然是完美的。
最后一件事。如果我将滤镜模式线移动到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);
此外,如果我使用Config.ARGB_4444
和GLES20.GL_UNSIGNED_SHORT_5_6_5
,红色调会变黄,并且看起来不那么糟糕:
请!有人说明了为什么会发生这种情况
答案 0 :(得分:0)
似乎是特定于设备的。所以我总是使用ARGB8888来保证安全。可惜,因为它会大大减少内存占用。