繁体   English   中英

Android OpenGL ES 2.0纹理无法在某些尺寸下使用

[英]Android OpenGL ES 2.0 Textures not working at some sizes

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

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

我正在像这样加载位图(用作Open GL Texture):

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

BMFOptions设置以下行:

BMFOptions.inPreferredConfig = Bitmap.Config.RGB_565;

当我运行我的应用程序时,最初发生的是纹理显示为一个黑色正方形。 所以,我在另一台设备(平板电脑)上尝试过,它运行得很好。

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

但是,当我调用getConfig时,它返回null (仅当指定了RGB_565且仅在此设备上的此位图/纹理上)。

我试过的

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

如果我将其设置为ARGB_4444(仅用于测试),则它会显示,但纹理是弯曲的/倾斜的(再次是该位图/纹理)。

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

我将其调整为505 x 201、506 x 201以及其他多种尺寸,但仍然无法正常工作(请注意,这些是Sprite工作表,因此,这些尺寸只是他们的工作方式)。

然后,我将其尺寸调整为506 x 204,它确实起作用了。 然后,我以1880 x 921进行了尝试,然后再次工作。

我没有使用NPOT纹理,以前也从未遇到过问题,请记住,我还具有其他尺寸奇怪的纹理,例如1880 x 921和1000 x 885,这些在手机上表现完美(但显然它们的像素数据/布局不同)。

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

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

    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];
    }

某些手机​​只能使用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,它看起来会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM