opengl - 使用 GLSL 帧缓冲区渲染时出错

标签 opengl glsl render framebuffer

我试图在覆盖屏幕的 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/

相关文章:

c++ - 如何使用opengl绘制一个简单的网格?

python - 如何制作阴影贴图?

vue.js - 包含 Vue 组件的一串 HTML 的 Nuxt 渲染函数

templates - Magento cms 页面渲染 {{ }} 变量

ruby-on-rails - 如何使用 Rails 5 中的 Application.renderer.render 和设计

java - 现代 GLSL 基础知识

opengl - 关于在 GLSL 中避免 IF

c++ - glUniformMatrix4fv 失败,错误代码为 GL_INVALID_OPERATION

java - 如何在 JOGL 中编辑顶点着色器

c++ - 找不到 GLSL 着色器统一位置