我刚发现我的应用程序存在一个非常奇怪的问题。
在手机上运行时会出现此问题。
我正在加载一个位图(用作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];
}
答案 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,它看起来会更好。