3

我在网上看到了许多示例(例如),它们执行以下操作

  • 创建和绑定 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. 为什么我们不需要再次绑定所有的 BUFFERS(我的意思是在使用/绘制对象到 FBO 时)?

2. 幕后发生了什么?

编辑:附加-> 绑定和解除附加-> 取消绑定

4

2 回答 2

8

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

于 2011-05-26T21:18:22.553 回答
3

我认为通过

  • 然后,解除 BUFFERS

你参考这个

glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);

但是,这不是分离,这是unbind,这意味着不同的东西。渲染缓冲区仍附加到 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 );
于 2011-05-26T22:12:16.143 回答