2011-08-26 186 views
2

我正在研究一些Android代碼,用於在丟失和重新創建EGL上下文之間緩存和重繪幀緩衝區對象的顏色緩衝區。開發主要發生在運行Honeycomb的Xoom平板電腦上。無論如何,我想要做的就是將調用glOadPixels()的結果存儲在FBO的直接ByteBuffer中,然後將該緩衝區與glTexImage2D()一起使用,並將其拖回(現在已清除)framebuffer中。所有這些似乎工作正常 - 根據Java無法理解無符號字節,ByteBuffer包含正確的值(像素爲[-1,0,0,-1]等),沒有GlErrors似乎被拋出,並且四元組被繪製到屏幕的右側(爲了測試目的,當前是幀緩衝區的左上角)。Android OpenGL ES 2.0 - glReadPixels()和glTexImage2D()繪製黑色紋理?

但是,不管我嘗試什麼,glTexImage2D()總是輸出一個普通的黑色紋理。我之前遇到過一些問題 - 顯示位圖時,我最終放棄嘗試使用帶緩衝區的基本GLES20.glTexImage2D(),並跳過使用GLUtils.glTexImage2D(),它會爲您處理位圖。不幸的是,這裏沒有什麼選擇(我實際上已經嘗試將ByteBuffer轉換爲位圖,所以我可以使用GLUtils,但沒有太多成功),所以我真的用完了想​​法。

任何人都可以想到任何可能導致glTexImage2D()無法正確處理完美的ByteBuffer?任何和所有的建議將受到歡迎。

ByteBuffer pixelBuffer; 

void storePixels() { 
    try { 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbuf); 
    pixelBuffer = ByteBuffer.allocateDirect(width * height * 4).order(ByteOrder.nativeOrder()); 
    GLES20.glReadPixels(0, 0, width, height, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer); 
    GLES20.glBindFrameBuffer(GLES20.GL_FRAMEBUFFER, 0); 
    gfx.checkGlError("store Pixels"); 
    }catch (OutOfMemoryError e) { 
    pixelBuffer = null; 
    } 
} 

void redrawPixels() { 
    GLES20.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fbuf); 
    int[] texId = new int[1]; 
    GLES20.glGenTextures(1, texId, 0); 
    int bufferTex = texId[0]; 
    GLES20.glBindTexture(GL20.GL_TEXTURE_2D, bufferTex); 
    GLES20.glTexParameterf(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MAG_FILTER, GL20.GL_LINEAR); 
    GLES20.glTexParameterf(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_MIN_FILTER, GL20.GL_LINEAR); 
    GLES20.glTexParameterf(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_S, repeatX ? GL20.GL_REPEAT 
    : GL20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameterf(GL20.GL_TEXTURE_2D, GL20.GL_TEXTURE_WRAP_T, repeatY ? GL20.GL_REPEAT 
    : GL20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_RGBA, width, height, 0, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer); 
    gfx.drawTexture(bufferTex, width, height, Transform.IDENTITY, width/2, height/2, false, false, 1); 
    GLES20.glDeleteTextures(1, IntBuffer.wrap(new int[] {bufferTex})); 
    pixelBuffer = null; 
    GLES20.glBindFrameBuffer(GLES20.GL_FRAMEBUFFER, 0); 
} 

gfx.drawTexture()建立了一個四人間和它吸引到當前綁定的幀緩衝區,順便說一句。該代碼已在我的項目的其他部分進行了充分測試 - 這不應該成爲問題。

回答

2

對於那些在家玩的人來說,這段代碼其實是完全有效的。請記住,當我發誓失明,gfx.drawTexture()已被良好測試,並不應該成爲問題在這裏「?是的,這是完全問題在那裏,我緩衝頂點繪製沒有實際衝過他們通過glDrawElements()調用喔。