Android OpenGL ES 2.0纹理无法在某些尺寸上运行

时间:2015-02-11 10:21:07

标签: java android textures opengl-es-2.0 bitmapfactory

我刚发现我的应用程序存在一个非常奇怪的问题。

在手机上运行时会出现此问题。

我正在加载一个位图(用作Open GL纹理),如下所示:

 tiles = BitmapFactory.decodeResource(view.getResources(), R.drawable.tilespic, BMFOptions);

BMFOptions正在设置以下行:

BMFOptions.inPreferredConfig = Bitmap.Config.RGB_565;

当我运行我的应用程序时,最初发生的事情是纹理看起来只是一个黑色方块。所以,我在另一台设备(平板电脑)上尝试过,它运行得非常好。

我知道如果位图有alpha通道,BitmapFactory只会将其加载为ARGB_8888,如果指定了Bitmap.Config.RGB_565并且我已经用其他位图确认了这一点(通过调用getConfig)。此位图确实具有Alpha。

然而,当我在其上调用getConfig时,它会返回 null (仅当指定了RGB_565并且仅在此设备上使用此位图/纹理时)。

我尝试了什么

如果我将其设置为ARGB_8888或只是省略此位图的BMFOptions,则所有内容都会正确显示。

如果我将它设置为ARGB_4444(仅用于测试),那么它会显示但是纹理是弯曲的/有角度的(再次只是这个位图/纹理)。

所以,我所做的是调整原始位图的大小(原始大小 - 100 x 909)。

我将它调整为505 x 201,506 x 201以及其他大小的尺寸,但它仍然不起作用(请注意这些是精灵表,因此,这些尺寸只是它们如何制定出来的。)

然后我将其重新调整为506 x 204并且 工作。然后我在1880 x 921尝试了它,它再次起作用。

我没有使用NPOT纹理,之前从未遇到任何问题,请记住我还有其他具有奇数尺寸的纹理,例如1880 x 921和1000 x 885,这些在这款手机上表现得非常完美(但很明显,像素数据/布局不同。)

由于此位图具有alpha(我需要),我现在只是删除此特定位图的BMFOptions并允许它作为ARGB_8888加载,但是,我想知道这种奇怪行为的任何可能原因。 / p>

如果有用,这是我用来加载纹理的代码....

    public static int LoadTexture(GLSurfaceView view, Bitmap imgTex){

        int textures[] = new int[1];
        try {

            GLES20.glGenTextures(1, textures, 0);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);

            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgTex, 0);

            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);

        } catch (Exception e){
          }
        textureCount++;     
        return textures[0];
    }

1 个答案:

答案 0 :(得分:0)

有些手机只能使用2种尺寸的纹理。
例如256x256,512x512,1024x128将工作
300x300,512x100等不起作用。

这是OpenGL ES 2.0标准的要求(afaik 3.0放宽了这一点)。有些手机可以使用2-pow-of-2纹理,但并非必须这样做。如果您希望尽可能多地定位手机,那么坚持使用2-pow-of2纹理是一种安全的方法。

如果这不是问题,请查看是否有任何GLErrors。

我也注意到:你正在使用GL10.GL_TEXTURE_2D,而在其他行中你正在使用GLES20。*。我查了一下,GL_TEXTURE_2D在这两个地方定义为3553,但如果你在那里使用GLES20,它看起来会更好。

相关问题