打开 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 带有不完整的缺少附件错误
如何在 OpenGL ES 2.0 中使用 GL_FLOAT 创建纹理?
共享内存架构中的 OpenGL (ES 2.0) VBO 性能