0

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

问题描述:
我想做的是交换我正在渲染的纹理。当应用程序启动时,我加载了一个纹理并且它渲染得很好。后来我想替换它并再次调用相同的加载函数,从而生成一个新的纹理 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);
    }
}
4

1 回答 1

0

所以我想我找到了我的问题。

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

于 2012-09-03T19:43:14.697 回答