2012-03-24 124 views
2

我想進入屏幕中覆蓋屏幕的2D紋理中的視頻幀,我必須使用幀緩衝區,因爲最終我希望執行乒乓渲染技術。但目前我首先想要通過使用幀緩衝器來實現屏幕渲染。使用GLSL framebuffer渲染時出錯

這是我的設置代碼:

// Texture setup 

int[] text = new int[1]; 
glGenTextures(1, text, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 512, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, null); 

// Frambuffer setup 

int[] fbo = new int[1]; 
glGenFramebuffers(1, fbo, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, text[0], 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

到這裏一切ok,我在這裏沒有寫測試代碼,以保持它小,但之後我檢查,如果幀緩衝正確創建,一切皆好。

現在在我的渲染循環我下一步:

// Use the GLSL program 

glUseProgram(programHandle); 

// Swap to my FBO 

glBindTexture(GL_TEXTURE_2D, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]); 
glViewport(0, 0, 512, 512); 

// Pass the new image data to the program so the fragment shader processes it. 
// Using glTexSubImage2D to speed up 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, text[0]); 
glUniform1i(glGetUniformLocation(programHandle, "u_texture"), 0); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_LUMINANCE, GL_UNSIGNED_BYTE, NewImageData); 

// Draw the quad 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Swap back to the default screen frambuffer 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

在這一點上,我得到一個黑色的屏幕,並在日誌中我可以看到一個GL_INVALID_FRAMEBUFFER_OPERATION 1286 我試圖把調用glDrawArrays的glBindFramebuffer電話後,但然後應用程序崩潰。 有什麼想法?提前致謝。

+0

int text [] = new int [1]; ??? int fbo = new int [1]; ???沒有冒犯性,但也許學習如何用C++聲明變量和數組將是在研究如何將場景渲染到紋理之前的第一步:p。 – Robinson 2012-03-24 12:47:32

+0

糟糕,我的錯,只是一個錯字,而清理它粘貼在這裏。另一方面是用Java編寫的。我只是更新了代碼avobe,因爲它應該。我希望有人能看到我做錯了什麼。 – PerracoLabs 2012-03-24 12:58:14

+0

啊。這是Java。你可以調用int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);並查看它返回的內容(綁定緩衝區以供使用)。 – Robinson 2012-03-24 13:17:56

回答

2

LUMINANCE紋理不可渲染,這意味着您無法使用FBO渲染它們。這個問題可以通過GL_ARB_texture_rg擴展來解決,它引入了可以渲染的一個和兩個通道紋理格式。

+0

該代碼必須在Android中運行,因此我無法使用可能不適用於所有手機型號的擴展。所以我想我必須重新考慮整個方法。 – PerracoLabs 2012-03-24 17:02:07