Android OpenGL ES 2.0交换纹理失败

Android OpenGL ES 2.0交换纹理失败,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我已经搜索了很多,所有类似的问题和解决方案都还没有对我起作用。所以我希望有人能认识到我的问题 问题描述: 我要做的是交换渲染时使用的纹理。 当应用程序启动时,我加载一个纹理,它渲染得很好。 稍后我想替换它并再次调用相同的加载函数,从而生成一个新的纹理id。当我使用新的纹理id进行渲染时,我会遇到模型完全变黑的问题 因此,如果我运行下面的代码,就会发生上述情况: Bitmap bmp = BitmapFactory.decodeResource(this.getResources(),

我已经搜索了很多,所有类似的问题和解决方案都还没有对我起作用。所以我希望有人能认识到我的问题

问题描述:
我要做的是交换渲染时使用的纹理。 当应用程序启动时,我加载一个纹理,它渲染得很好。 稍后我想替换它并再次调用相同的加载函数,从而生成一个新的纹理id。当我使用新的纹理id进行渲染时,我会遇到模型完全变黑的问题

因此,如果我运行下面的代码,就会发生上述情况:

Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), 
    R.drawable.sphere_map1);
currentTexture = TextureHelper.loadTextureToOGL(bmp);
我有一个完全黑色的纹理问题

下面是我用来加载纹理和绘制模型的一些重要函数 如果有人需要其他代码,请告诉我。由于这是我的第一篇文章,请随意就文章的结构提出建议

事先谢谢你

 public static int loadTextureToOGL(Bitmap bitmap) {
    int texId[] = { -1 };
    GLES20.glGenTextures(1, texId, 0);
    int textureId = texId[0];
    glBindTexture(GLES20.GL_TEXTURE_2D, textureId);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, mMinFilter);
    glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, mMaxFilter);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0, GL_RGBA, bitmap, 0);
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

    GeneralUtil.printGLErrorInHex();
    bitmap.recycle();

    return textureId;
}

public void draw(float[] mvp) {
    glUseProgram(mProgram);

    glEnableVertexAttribArray(mPositionHandle);
    glEnableVertexAttribArray(mNormalHandle);
    glEnableVertexAttribArray(mTexCoordHandle);

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, currentTexture);
    glUniform1i(mEnvTex0Handle, 0);

    glUniformMatrix4fv(mMVPHandle, 1, false, mvp, 0);

    glUniform3f(mColorHandle, red, green, blue);
    glUniform1f(mAttSpecularHandle, attSpecular);
    glUniform1f(mAttDiffuseHandle, attDiffuse);
    glUniform1f(mAttAmbientHandle, attAmbient);

    GeneralUtil.printGLErrorInHex();
    if (model != null) {
        glDrawArrays(GL_TRIANGLES, 0, model.getmNFaces() * 3);
    }
}

所以我想我发现了我的问题

我没有从GL线程运行glTexImage调用,而是从UI线程运行它。
我没有意识到它自己创建了一个GL线程

如果您从
GLUtils.texImage2D(…)
中删除内部格式并让GLUtils自动确定它,是否有任何机会?实际上,这是我第一次使用它的方式,因此没有任何区别:(你的问题不太清楚。首先你说如果我重新加载纹理,它会失败,然后你说如果我运行这个,它会失败,一个片段根本没有显示任何重新加载。如果它真的只在第二次失败,你能显示整个上下文,显示第一次加载和第二次加载失败,以及你是如何绘制它的吗?我同意它有点f。)乌兹。这种情况很难用文字来解释,但我重写了它,以强调我想要发生的事情和实际发生的事情。我希望它更清楚。因此重新加载是不好的措辞。我宁愿用另一种纹理替换我正在渲染的纹理。