打开 GL ES 2 - glFramebufferTexture2D 带有不完整的缺少附件错误

Posted

技术标签:

【中文标题】打开 GL ES 2 - glFramebufferTexture2D 带有不完整的缺少附件错误【英文标题】:Open GL ES 2 - glFramebufferTexture2D with Incomplete Missing Attachment error 【发布时间】:2018-01-13 10:46:04 【问题描述】:

我是 OpenGL/GLES 新手,使用以下代码从 EGLImageKHR 生成帧缓冲区时出现 Incomplete Missing Attachment 错误:

GLuint texture;
GLuint framebuffer;

EGLImageKHR image = eglCreateImageKHR(display,
                                      EGL_NO_CONTEXT,
                                      EGL_NATIVE_PIXMAP_KHR,
                                      (EGLClientBuffer)&pixmap,
                                      NULL);
assert(image != EGL_NO_IMAGE_KHR);

glGenTextures(1, &texture);
glGenTextures(1, &framebuffer);

glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, 
                       GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_EXTERNAL_OES, 
                       texture, 
                       0);
glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

eglDestroyImageKHR(display,image);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);

我在使用时得到了 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:

glFramebufferTexture2D(GL_FRAMEBUFFER, 
                       GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_EXTERNAL_OES, 
                       texture, 
                       0);

以及将纹理更改为 GL_TEXTURE_2D 时的 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:

glFramebufferTexture2D(GL_FRAMEBUFFER, 
                       GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, 
                       texture, 
                       0);

图像和纹理正确,因为我可以正确显示。我不知道我在这里错过了什么。

【问题讨论】:

谢谢@Rabbid76,问题是我正在使用EGL扩展直接从相机显示UYVY图像的系统,没有颜色转换,所以如果我按照你的建议去做,它会从30fps 到 15fps 左右。这就是为什么我必须坚持使用 GL_TEXTURE_EXTERNAL_OES。 顺便说一句,即使在glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 之后,我也收到了 Incomplete Attachment 错误,这正常吗? 【参考方案1】:

我刚刚找到了答案,正如 Raspi 论坛中所解释的那样: Can't render to render buffer

我们必须在这个函数中使用 GL_TEXTURE_2D:

glFramebufferTexture2D(GL_FRAMEBUFFER, 
                   GL_COLOR_ATTACHMENT0, 
                   GL_TEXTURE_2D, 
                   texture, 
                   0);

并且必须创建一个空纹理 GL_TEXTURE_2D 以在渲染之前将我们的帧缓冲区绑定到该纹理。 GL_TEXTURE_EXTERNAL_OES 和 GL_TEXTURE_2D 是不同的纹理,不能混合在一起。

【讨论】:

嗨,肯尼,我正在努力让它发挥作用。能发一下代码吗?

以上是关于打开 GL ES 2 - glFramebufferTexture2D 带有不完整的缺少附件错误的主要内容,如果未能解决你的问题,请参考以下文章

打开 GL ES 2 - glFramebufferTexture2D 带有不完整的缺少附件错误

Iphone 打开 gl es 应用程序和自动释放池

如何在 OpenGL ES 2.0 中使用 GL_FLOAT 创建纹理?

共享内存架构中的 OpenGL (ES 2.0) VBO 性能

Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题

OpenGL ES 2.0 剪裁测试