2013-02-04 155 views
2

我想呈現一個XML佈局到OpenGL表面。這工作正常,我可以在佈局上做3D效果。但是,當我嘗試更新它並再次渲染時,它不起作用。通過旋轉和嘗試不同的功能,最終結果可能是黑色對象,表面外部小部件的圖形損壞,或者原始對象沒有任何修改。Android的OpenGL ES 2.0紋理更新顯示黑色

我的代碼轉化爲了一個位圖:

public static Bitmap toBitmap(final View view) { 
    final Bitmap bitmap = Bitmap.createBitmap(400, 100, 
      Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bitmap); 
    final Paint paint = new Paint(); 

    view.setDrawingCacheEnabled(true); 

    final int width = MeasureSpec.makeMeasureSpec(canvas.getWidth(), 
      MeasureSpec.EXACTLY); 
    final int height = MeasureSpec.makeMeasureSpec(canvas.getHeight(), 
      MeasureSpec.EXACTLY); 
    view.measure(width, height); 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

    canvas.drawBitmap(view.getDrawingCache(), 0, 0, paint); 

    return bitmap; 
} 

然後,在我的對象的構造,我呼籲:

public static int loadTexture(final Bitmap bitmap) { 
    GLES20.glGenTextures(1, textureHandle, 0); 

    if (textureHandle[0] != 0) { 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 

     bitmap.recycle(); 
    } 

    if (textureHandle[0] == 0) { 
     throw new RuntimeException("Error loading texture."); 
    } 

    return textureHandle[0]; 
} 

再次調用loadTexture()方法用更新的佈局會呈現黑色。我寫了另一個小方法來嘗試不同的方法:

public static int updateTexture(final Bitmap bitmap) { 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
      GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
      GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 

    GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap); 
    //GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
    // GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 

    return textureHandle[0]; 
} 

這使得原有的質感不變,併產生一個錯誤:

<qgl2DrvAPI_glTexSubImage2D:502>: GL_INVALID_VALUE 
glStartTilingQCOM: 0x501 

texImage2D()談到的texSubImage2D()呼叫和更換它什麼也不做,併產生沒有錯誤信息。

如果任何人都可以闡明我可能做錯的任何事情,那將不勝感激。

謝謝!

+0

你是否從OpenGL線程調用更新方法?如果使用texSubImage函數,則不需要再指定紋理參數。 – Trax

+0

@TraxNet解決了它:現在我註冊了我想更新紋理,然後在'onDraw()'中做適當的更新。現在我被我的新紋理卡在其他表面上,但我相信這個新的bug與這個問題無關。 – pfcuttle

+0

我添加了一個答案(複製並粘貼我的評論),以便您可以將其標記爲已解決。針對您的新問題開一個新問題。最好的祝福。 – Trax

回答

0

您是否從OpenGL線程調用更新方法?如果使用texSubImage函數,則不需要再指定紋理參數。