0

我的源图像是 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);

2 级 Mipmap,完美
但是,为了将内存使用量降至最低,我更愿意将图像加载为 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);

诡异的

另外,如果我使用Config.ARGB_4444and GLES20.GL_UNSIGNED_SHORT_5_6_5,红色会变成黄色,看起来还不错:

ARGB_4444 Level1

请!有人解释了为什么会这样

4

1 回答 1

0

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

于 2014-10-12T16:16:23.630 回答