【发布时间】:2012-04-08 17:59:56
【问题描述】:
我正在尝试以 2d 纹理覆盖屏幕的视频帧进入屏幕,我必须使用帧缓冲区,因为最终我希望使用乒乓渲染技术。但目前我想先实现只在屏幕上使用帧缓冲区进行渲染。
这是我的设置代码:
// 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);
到这里一切正常,我没有在这里写测试代码来保持它的小,但是在我检查帧缓冲区是否正确创建之后,一切都很好。
现在在我的渲染循环中,我接下来要做:
// 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。 我尝试在 glBindFramebuffer 调用之后放置 glDrawArrays,但随后应用程序崩溃。 有什么想法吗?提前致谢。
【问题讨论】:
-
int text[] = new int[1];??? int fbo = 新的 int[1]; ???没有冒犯,但也许学习如何在 C++ 中声明变量和数组将是解决如何将场景渲染到纹理之前的第一步:p。
-
哎呀,我的错,只是在清理它以将其粘贴到此处时打错了。另一方面是用Java编写的。我刚刚更新了应该的代码avobe。我希望有人能看到我做错了什么。
-
啊。是Java。你能打电话 int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);并查看它返回的内容(绑定缓冲区以供使用之后)。
标签: opengl glsl render framebuffer