创建没有帧缓冲区绑定的 Opengl 渲染缓冲区
Posted
技术标签:
【中文标题】创建没有帧缓冲区绑定的 Opengl 渲染缓冲区【英文标题】:Creating Opengl renderbuffer with no framebuffer bound 【发布时间】:2017-03-13 22:59:52 【问题描述】:当我使用帧缓冲区进行屏幕外渲染时,我注意到了一些奇怪的事情。我正在将一个立方体渲染到一个纹理上,然后将该纹理渲染到一个平面上。这一切都奏效了,我决定跳过深度缓冲区,所以我注释掉了块 1 和块 2(见下面的代码),它也起作用了,但是,如果我保持块 1 完整而只注释掉块 2,飞机就会变黑。
我会假设通过注释掉 block2 渲染缓冲区将只是一个渲染缓冲区,与帧缓冲区没有关联。
在每个示例中,我发现在创建渲染缓冲区之前总是绑定了一个帧缓冲区,但我在文档中找不到任何说明它必须的内容。是否应该仅注释掉 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 和 BLOCK 1,一切正常(就像一个只有颜色附件的帧缓冲区)
// binding texture as an attachment to frame buffer
glFramebufferTexture2D(...);
glDrawBuffers(1, drawBuffers);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
以上所有代码都按此顺序执行,中间没有其他 OpenGL 调用。
【问题讨论】:
如果我们能看到您如何准确地附加渲染缓冲区和纹理,这将有所帮助。以及绑定 FBO 的确切时间(相对于代码的其余部分)。另外,为什么要绑定纹理,然后将纹理附加到帧缓冲区,然后取消绑定纹理?将纹理绑定到上下文与 FBO 无关。 我添加了一些说明,但会在我的设置中提供完整的 gl 调用列表(一切都是抽象的,但我要实现一个 gl 调用记录器)。感谢您指出不必要的纹理绑定。我不明白为什么块 1 中的渲染缓冲区如果未附加会影响我的帧缓冲区。谢谢! 【参考方案1】:发现错误。由于类的抽象,当纹理类超出范围时,纹理被删除。此纹理句柄默认设置为 0,使用此句柄 id 的另一个纹理被删除。
【讨论】:
以上是关于创建没有帧缓冲区绑定的 Opengl 渲染缓冲区的主要内容,如果未能解决你的问题,请参考以下文章