我使用以下代码获取错误:GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT。关于我在这里可能缺少的任何想法:
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 640, 480, 0, GL_RGBA4, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &renderTexture);
glBindFramebuffer(GL_FRAMEBUFFER, renderTexture);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
GLint val = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(val != GL_FRAMEBUFFER_COMPLETE)
{
std::cout <<"\n Error in framebuffer : 2";
}
这里的其余代码用于渲染和blit到默认FB.But不会呈现任何想法吗?期望默认FB上的绿色清除
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f,1.0f,0.0f,0.0f);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderTexture);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
val = glGetError();
if( val == GL_NO_ERROR)
std::cout<<"\n Bind Fine";
val = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(val != GL_FRAMEBUFFER_COMPLETE)
{
std::cout <<"\n Error in framebuffer : 3";
}
glBlitFramebuffer(0,0,128,128,0,0,128,128, GL_COLOR_BUFFER_BIT, GL_NEAREST);
答案 0 :(得分:6)
您需要在对其进行操作的调用之前绑定FBO。修改对象的OpenGL调用通常在当前绑定的对象上运行。它与发布代码开头的纹理遵循相同的方案,您可以使用glGenTextures()
生成纹理ID,将其与glBindTexture()
绑定,然后进行修改纹理的调用,如{ {1}}和glTexParameteri()
。
在FBO案例中,glTexImage2D()
和glFrameBufferTexture2D()
对当前绑定的FBO进行操作。因此glDrawBuffer()
调用需要在这些调用之前进行:
glBindFramebuffer()
如果您的代码发现任何意外行为,请致电glGenFramebuffers(...);
glBindFramebuffer(...);
glFramebufferTexture2D(...);
glDrawBuffer(...);
。你会看到glGetError()
调用出现GL_INVALID_OPERATION
错误,因为没有绑定FBO。
关于代码的更多观察:
glFramebufferTexture2D()
调用是多余的。 glDrawBuffer()
是FBO的默认绘制缓冲区。GL_COLOR_ATTACHMENT0
,但glFramebufferTexture()
也可以正常使用。 glFramebufferTexture2D()
需要更新的OpenGL版本(3.2),并且仅对分层附件(纹理数组等)有用。