我在网上看到了很多例子(例如这个),它们都做以下操作:
1. 为什么我们在使用/绘制对象到FBO时不需要再次绑定所有缓冲区?
2. 这里的底层操作是什么?
编辑:附加->绑定和解除附加->取消绑定。
- 创建并绑定FBO
- 创建并绑定缓冲区(纹理、渲染、深度、模板)
- 然后,解绑缓冲区
- 要使用FBO-绑定FBO,进行操作,然后解绑FBO
- 但是,还要绑定纹理缓冲区以进行读写等操作
- 但是从未见过重新绑定其他缓冲区(渲染、深度、模板),为什么?
缓冲区创建、绑定/解绑的示例(下面的代码仅用于示例,以展示我所解释的内容,且可以完美运行):
// 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. 这里的底层操作是什么?
编辑:附加->绑定和解除附加->取消绑定。