帧缓冲区对象(FBO)与渲染和深度缓冲区关系

|| 我在网上看到了许多示例(例如),这些示例执行以下操作 创建并绑定FBO 创建和绑定缓冲(纹理,渲染,深度,模具) 然后,UnBind BUFFERS 要使用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.这里的幕后情况是什么? 编辑:附加->绑定并取消附加->取消绑定     
已邀请:
我不知道我是否完全了解您,但是绑定到附件点(
GL_COLOR_ATTACHMENT
...)的渲染缓冲区是按FBO状态,并且此FBO状态保持不变,您只需要绑定FBO即可告知OpenGL此FBO现在已使用,并且其所有状态(您之前设置的状态)都将生效。     
我认为      然后,拆下BUFFERS    你指的是这个
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 );
    

要回复问题请先登录注册