我想進入屏幕中覆蓋屏幕的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電話後,但然後應用程序崩潰。 有什麼想法?提前致謝。
int text [] = new int [1]; ??? int fbo = new int [1]; ???沒有冒犯性,但也許學習如何用C++聲明變量和數組將是在研究如何將場景渲染到紋理之前的第一步:p。 – Robinson 2012-03-24 12:47:32
糟糕,我的錯,只是一個錯字,而清理它粘貼在這裏。另一方面是用Java編寫的。我只是更新了代碼avobe,因爲它應該。我希望有人能看到我做錯了什麼。 – PerracoLabs 2012-03-24 12:58:14
啊。這是Java。你可以調用int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);並查看它返回的內容(綁定緩衝區以供使用)。 – Robinson 2012-03-24 13:17:56