【问题标题】:Frame Buffer Object (FBO) and Render & Depth Buffers Relation帧缓冲区对象 (FBO) 与渲染和深度缓冲区关系
【发布时间】:2011-05-26 20:46:42
【问题描述】:

我在网上看到很多例子 (for example),它们执行以下操作

  • 创建和绑定 FBO
  • 创建和绑定缓冲区(纹理、渲染、深度、模板)
  • 然后,解除绑定缓冲区
  • 要使用 FBO - 绑定 FBO,请先执行此工作,然后再取消绑定 FBO
  • 但是,也可以使用纹理缓冲区绑定纹理缓冲区以进行读取、写入等操作
  • 但从未见过重新绑定其他缓冲区(渲染、深度、模板),为什么?

BUFFERS 创建和绑定/取消绑定示例(以下代码仅作为示例,仅用于展示我解释的内容并完美运行),

// create a framebuffer object, you need to delete them when program exits.
glGenFramebuffersEXT(1, &fboId);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

// create color buffer object and attached to fbo
glGenRenderbuffersEXT(1, &rboId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind

if(useDepthBuffer) {
  glGenRenderbuffersEXT(1, &rboIdDepth);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);
  glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind
}

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rboId);
if(useDepthBuffer)
  glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboIdDepth);


// check FBO status
printFramebufferInfo();
bool status = checkFramebufferStatus();
if(!status)
  fboUsed = false;
.
//then,
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
// Do the work
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

1.为什么我们不需要再次绑定所有的缓冲区(我的意思是同时 与/绘图对象一起工作 FBO)?

2。这里到底发生了什么?

编辑:附加->绑定和分离->解除绑定

【问题讨论】:

    标签: opengl buffer framebuffer depth-buffer fbo


    【解决方案1】:

    我不知道我是否完全理解你,但是绑定到连接点 (GL_COLOR_ATTACHMENT...) 的渲染缓冲区是每个 FBO 状态,并且这个 FBO 状态保持不变你只需要绑定 FBO 来告诉现在使用这个 FBO 的 OpenGL 及其所有状态(您之前设置的)将生效。

    【讨论】:

    • .. 我也觉得“一模一样”。但没有得到任何授权文件提及。这就是我问这个问题的原因。让我们看看其他人的反应。谢谢。
    • @Rudi 你可以在这里相信我,我知道。您也可以查看OpenGL specification 以正式获得它。
    【解决方案2】:

    我认为

    • 然后,分离缓冲区

    你参考这个

    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);
    

    但这不是分离,这是解除绑定,意味着不同的东西。渲染缓冲区仍附加到 FBO。然而,绑定选择了要对其执行以下缓冲区对象操作的缓冲区对象。这有点像某些语言中的with 语句。

    缓冲区对象的实际附加,不必绑定,发生在这里

    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
                                 GL_COLOR_ATTACHMENT0_EXT, 
                                 GL_RENDERBUFFER_EXT, 
                                 rboId ); // rboID != 0
    

    它会被匹配分离

    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
                                 GL_COLOR_ATTACHMENT0_EXT, 
                                 GL_RENDERBUFFER_EXT, 
                                 0 );
    

    【讨论】:

    • 我已经编辑了问题:attach-> Bind and deattach-> UnBind。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多