在opengl中渲染到纹理

时间:2014-09-18 00:34:15

标签: opengl

我使用以下代码获取错误: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);

1 个答案:

答案 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),并且仅对分层附件(纹理数组等)有用。