【问题标题】:Error rendering with GLSL framebuffer使用 GLSL 帧缓冲区渲染时出错
【发布时间】: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


【解决方案1】:

LUMINANCE 纹理不可渲染,这意味着您无法使用 FBO 渲染它们。 GL_ARB_texture_rg 扩展解决了这个问题,它引入了一个和两个可渲染的通道纹理格式。

【讨论】:

  • 代码必须在 Android 中运行,所以我不能使用可能不适用于所有手机型号的扩展程序。所以我想我必须重新考虑整个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多