Open GL ES 2 - glFramebufferTexture2D with Incomplete Missing Attachment 错误

Open GL ES 2 - glFramebufferTexture2D with Incomplete Missing Attachment error

我是 OpenGL/GLES 的新手,当使用以下代码从 EGLImageKHR 生成帧缓冲区时,我遇到了附件丢失不完整错误:

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_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 将纹理更改为 GL_TEXTURE_2D 时:

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

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

我刚刚找到了答案,正如 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是不同的材质,不能混用。