我的源图像是 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
and GLES20.GL_UNSIGNED_SHORT_5_6_5
,红色会变成黄色,看起来还不错:
请!有人解释了为什么会这样