You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:30