我正在研究一些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()建立了一個四人間和它吸引到當前綁定的幀緩衝區,順便說一句。該代碼已在我的項目的其他部分進行了充分測試 - 這不應該成爲問題。