创建没有帧缓冲区限制的Opengl渲染缓冲区

时间:2017-03-13 22:59:53

标签: c++ opengl framebuffer fbo

当我使用帧缓冲区进行屏幕外渲染时,我发现了一些奇怪的东西。我正在将一个立方体渲染到纹理,然后将该纹理渲染到一个平面上。这一切都奏效了,我决定跳过深度缓冲区,所以我评论了第1块和第1块。第2块(参见下面的代码)并且它也有效,但是,如果我保留第1块完整并且只注释第2块,则该平面变黑。

我认为通过注释掉block2,renderbuffer只是一个没有与帧缓冲区关联的渲染缓冲区。

在每个例子中,我都可以发现在创建渲染缓冲区之前总是有一个帧缓冲区,但我在文档中找不到任何必须的东西。它应该只是注释掉block2并离开block1吗?

// create render buffer to store depth, at this point the default framebuffer is bound
{ //BLOCK 1
    glGenRenderbuffers(1, &handle);
    glBindRenderbuffer(...);
    glRenderbufferStorage(...);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);
}

如果我在评论BLOCK 2时让上面的代码运行,那么屏幕外纹理会变黑。

// create texture as a color attachment
glGenTextures(1, &handle);
glBindTexture(GL_TEXTURE_2D, handle);
glTexImage2D(...);
// filter, wrap omitted
glBindTexture(GL_TEXTURE_2D, 0);

上面的纹理绑定经过测试,在采样时效果很好。

// creating framebuffer
glGenFramebuffers(1, &handle);
glBindFramebuffer(GL_FRAMEBUFFER, handle);

// attach my render buffer as a depth attachment
{ // BLOCK 2
    glFramebufferRenderbuffer(...)
}

如果我评论BLOCK 2&第1块它一切正常(就像一个只有颜色附件的帧缓冲区)

// binding texture as an attachment to frame buffer
glFramebufferTexture2D(...);
glDrawBuffers(1, drawBuffers);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

以上所有代码都按此顺序执行,其间没有其他OpenGL调用。

1 个答案:

答案 0 :(得分:-1)

发现错误。由于类的抽象,当纹理类超出范围时,纹理被删除。此纹理句柄默认设置为0,另一个使用此句柄ID的纹理被删除。