Android 7.0下OpenGL ES 2纹理加载失败(显示黑色)求助
排查Android 7.0下OpenGL ES 2 Asset纹理变黑的问题
嘿,我之前在Android 7.0环境下搞OpenGL ES 2纹理加载时也踩过类似的坑,纹理总是莫名其妙显示成黑色。结合你给出的代码片段,咱们来梳理几个最可能的问题点和解决办法:
1. 修正BitmapFactory.Options的关键配置
你的代码里用到了options.inScale...,这里很容易踩坑:
- 必须设置
options.inScaled = false——OpenGL需要原始像素数据,系统默认的缩放会导致纹理数据异常,直接引发黑屏 - 推荐指定
options.inPreferredConfig = Bitmap.Config.ARGB_8888,确保Bitmap的像素格式和OpenGL的RGBA纹理格式完全匹配
示例代码:
final BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; // 关键:禁用系统自动缩放 options.inPreferredConfig = Bitmap.Config.ARGB_8888; // 对齐OpenGL纹理格式
2. 不要跳过纹理绑定步骤
生成纹理后,必须先绑定纹理到目标,才能进行后续的参数设置和数据上传——这是很多新手容易遗漏的步骤:
glGenTextures(1, textureHandle, 0); if(textureHandle[0] == 0) throw new RuntimeException("Error loading texture"); // 核心步骤:绑定纹理到GL_TEXTURE_2D目标 glBindTexture(GL_TEXTURE_2D, textureHandle[0]); // 配置纹理过滤和环绕参数(避免因参数错误导致黑屏) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3. 完善Asset文件的读取流程
从Asset加载Bitmap时,要确保输入流正确打开、解码,并且及时释放资源:
InputStream is = null; try { is = assetManager.open(img); // 注意:asset路径是相对路径,不要加开头的/ Bitmap bitmap = BitmapFactory.decodeStream(is, null, options); if (bitmap == null) { throw new RuntimeException("Failed to decode bitmap from asset: " + img); } // 上传纹理数据到GPU glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap); bitmap.recycle(); // 及时释放Bitmap内存,避免内存泄漏 } catch (IOException e) { throw new RuntimeException("Error opening asset stream: " + e.getMessage()); } finally { if (is != null) { try { is.close(); } catch (IOException e) { // 可记录日志,忽略关闭异常 } } }
4. 用OpenGL错误检查定位问题
每次关键的OpenGL调用后,都可以用glGetError()检查是否有错误,这能帮你快速定位哪一步出了问题:
int error = glGetError(); if (error != GL_NO_ERROR) { throw new RuntimeException("OpenGL error code: " + error); }
建议在glGenTextures、glBindTexture、glTexParameteri、glTexImage2D之后都加上这句,能快速排查出参数错误或调用顺序问题。
5. Android 7.0的特殊注意事项
- 路径大小写敏感:Android 7.0对asset文件的路径大小写要求更严格,确保你的
img参数和asset文件夹里的文件名完全一致(比如test.png和Test.png会被识别为两个不同的文件) - 检查asset文件是否打包:可以解压APK检查
assets目录下是否存在目标文件,避免因打包配置错误导致文件缺失
把这些点逐一排查,应该就能解决纹理变黑的问题了。
内容的提问来源于stack exchange,提问作者pianka
相关产品推荐
相关产品推荐

