GL_INVALID_VALUE 来自 GLUtils.texImage2D

GL_INVALID_VALUE from GLUtils.texImage2D

我正在尝试使用 OpenGLES2.0 为 Android 开发一款小游戏,但我遇到了这个问题,无法实现设备之间的兼容性。我在两台设备上测试我的应用程序,一台 Xperia Z1 和一台 Galaxy S2(因为模拟器不适用于 OpenGLES2.0)。如果我调用 GLUtils.texImage2D 来加载带有来自分辨率低于或等于 1024x1024 的图像的位图的纹理,它在两个设备上都可以正常工作。使用 2048x2048 的纹理适用于 S2,但不再适用于 Z1(它 returns GL_INVALID_VALUE)。加载任何高于此的值在 Z1 和 S2 中都不起作用。但是,我已经检查了 GL_MAX_TEXTURE_SIZE,并且在两个设备中它都设置为 4096。我不知道出了什么问题,我调用 texImage2D 如下:

GLES20.glGenTextures(1,texture,0);
Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.test);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

提前致谢!

好的,我会回答我自己的问题,因为我已经发现问题所在。由于我处于 android 开发的早期阶段,我将所有纹理放在 drawable 文件夹中。 Android 根据设备的 dpi 自动缩放此图像,Xperia Z1 的屏幕为 441dpi,而 Galaxy S2 为 217dpi,导致调整大小的因素更大,达到 GL_MAX_TEXTURE_SIZE 限制创建位图时使用较小的纹理。我现在正在使用 drawable-nodpi 文件夹并且它可以工作,但我会了解更多相关信息。