【发布时间】:2010-08-31 23:11:44
【问题描述】:
在尝试创建渲染到纹理的帧缓冲区后,我收到错误 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。我不知道出了什么问题,非常感谢任何帮助。
编辑:修复它!工作代码:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 768, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1024);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glGenFramebuffers(1, &backFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, backFramebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID);
[self checkFramebufferStatus];
glBindFramebuffer(GL_FRAMEBUFFER, 0);
注意:如果您的版本不起作用,请确保在每次调用后检查错误,并在第一次调用之前清除错误,否则您将在此之前检查代码。
【问题讨论】:
-
我正在将我的代码与这个 sn-p 进行比较以尝试找出错误。对于 Android OpenGL ES 2.0,我的收获是 GL_DEPTH_COMPONENT 与 GL_DEPTH_COMPONENT16。在 glRenderBufferStorage 中确保深度组件是 GL_DEPTH_COMPONENT16。很难捕捉到,因为每一行代码都与您的 sn-p 相同。
-
你也应该留下不好的代码,这样人们在事后阅读它就能看到解决方案。或者至少解释一下你检查的内容。无论如何,感谢您显示固定代码。
-
@Halsafar 是的,这是一个很常见的错误。还好你注意到了。但是,如果你包装检查错误,你会更快地发现这个错误,因此我的最后一条评论是“每次调用后检查错误”。
-
抱歉,这可能是一个小问题,但我看到您的代码在任何地方都不包含 _OES / OES。对于我的标题,我必须使用 GL_FRAMEBUFFER_OES 而不是 GL_FRAMEBUFFER ...等等。我只是想知道您是否真的删除了“_OES”进行演示? (顺便感谢一下,这个示例代码确实有帮助)。
-
@Nick 请不要从问题中删除无效代码,因为这会使您提出的问题对未来的访问者几乎毫无用处。
标签: opengl-es