Я видел много примеров в Интернете (, например, ), которые выполняют следующие действия:
- Создание и привязка FBO
- Создание и привязка BUFFERS (текстура, рендеринг, глубина, трафарет)
- Затем UnBind BUFFERS
- Чтобы работать с FBO-Bind FBO, выполните работу, затем UnBind FBO
- Однако, также связывайте текстуру BUFFER для чтения, записи и т. Д. С текстурой BUFFER
- НО НИКОГДА НЕ СМОТРЕТЬ повторной привязки других буферов (рендер, глубина, трафарет), почему?*
Пример создания BUFFERS и bind / unbind (код ниже приведен только для примера, чтобы показать, что я объяснил, и отлично работает),
// 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.Почему нам не нужно снова связывать все буферы (я имею в виду, работая с / Drawing-Object-FBO)?
2.Что здесь происходит под капотом?
РЕДАКТИРОВАТЬ: attach-> Bind and deattach-> UnBind