C++ 创建无帧缓冲区绑定的Opengl renderbuffer

C++ 创建无帧缓冲区绑定的Opengl renderbuffer,c++,opengl,framebuffer,fbo,C++,Opengl,Framebuffer,Fbo,当我使用帧缓冲区进行屏幕外渲染时,我注意到了一些奇怪的事情。我将立方体渲染为纹理,然后将该纹理渲染到平面上。这一切都起作用了,我决定跳过深度缓冲区,所以我注释掉了块1和块2(见下面的代码),它也起作用了,但是,如果我保持块1不变,只注释掉块2,平面就会变黑 // create texture as a color attachment glGenTextures(1, &handle); glBindTexture(GL_TEXTURE_2D, handle); glTexImage2D

当我使用帧缓冲区进行屏幕外渲染时,我注意到了一些奇怪的事情。我将立方体渲染为纹理,然后将该纹理渲染到平面上。这一切都起作用了,我决定跳过深度缓冲区,所以我注释掉了块1和块2(见下面的代码),它也起作用了,但是,如果我保持块1不变,只注释掉块2,平面就会变黑

// create texture as a color attachment
glGenTextures(1, &handle);
glBindTexture(GL_TEXTURE_2D, handle);
glTexImage2D(...);
// filter, wrap omitted
glBindTexture(GL_TEXTURE_2D, 0);
我假设通过注释掉block2,renderbuffer将只是一个与帧缓冲区没有关联的renderbuffer

在每个示例中,我都能找到在创建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);
}
如果我让上面的代码在块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(...)
}
如果我对block2和block1进行注释,它都可以正常工作(就像只带有颜色附件的帧缓冲区)


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

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

如果我们可以看到您如何准确地附加renderbuffer和纹理,这将有所帮助。以及绑定FBO的确切时间(相对于代码的其余部分)。另外,为什么要绑定纹理,然后将纹理附加到帧缓冲区,然后取消绑定纹理?将纹理绑定到上下文与FBO无关。我添加了一些说明,但会在设置中返回完整的gl调用列表(所有内容都是抽象的,但我将实现一个gl调用记录器)。感谢您指出不必要的纹理绑定。我不明白为什么块1中的渲染缓冲区在未连接的情况下会影响帧缓冲区。谢谢