Frame Buffer Object (FBO) и отношение буферов рендеринга и глубины - PullRequest
3 голосов
/ 27 мая 2011

Я видел много примеров в Интернете (, например, ), которые выполняют следующие действия:

  • Создание и привязка 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

Ответы [ 2 ]

8 голосов
/ 27 мая 2011

Я не знаю, полностью ли я вас понял, но буферы рендеринга, привязанные к точкам присоединения (GL_COLOR_ATTACHMENT ...), находятся в состоянии для каждого FBO, и это состояние FBO остается неизменным, вам нужно только связать FBO, чтобы сообщить OpenGL, что этот FBO теперь используется и все его состояния (которые вы установили ранее) вступят в силу.

3 голосов
/ 27 мая 2011

думаю по

  • Тогда, отсоедините БУФЕРЫ

Вы ссылаетесь на это

* * 1010

Однако это не отрыв, это 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 );
...