我试图在覆盖屏幕的 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。 我尝试将 glDrawArrays 放在 glBindFramebuffer 调用之后,但随后应用程序崩溃了。 有什么想法吗?提前致谢。
最佳答案
亮度纹理不可渲染,这意味着您无法使用 FBO 渲染它们。这个问题可以通过 GL_ARB_texture_rg 扩展解决,该扩展引入了可渲染的一 channel 和二 channel 纹理格式。
关于opengl - 使用 GLSL 帧缓冲区渲染时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9851684/