【发布时间】: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