2012-08-30 39 views
0

我已經搜索了很多,所有類似的問題和解決方案還沒有爲我工作。所以我希望有人會認識到我的問題Android的OpenGL ES 2.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); 
    } 
} 
+0

如果您從GLUtils.texImage2D(...)中刪除內部格式,並讓GLUtils自動判斷它是否有任何機會? – harism

+0

其實這就是我第一次這樣做,所以沒有區別:( –

+0

你的問題不是很清楚,起初你說*如果我**重新**加載紋理,它失敗*,然後你說*如果我運行它,它會失敗*,一個片段根本不顯示任何重新加載,如果它真的只是第二次失敗,您能顯示整個上下文,顯示第一個加載和第二個加載失敗,你怎麼畫的? – Tim

回答

0

所以我覺得我發現我的問題。

而不是從GL線程運行glTexImage調用我改爲從UI線程運行它。 我沒有意識到它自己創建了一個GL線程。