Копирует ли glBlitFramebuffer все цветовые вложения, если указана маска GL_COLOR_BUFFER_BIT?
Если я копирую пиксели из одного FBO в другое, и у каждого из них есть несколько (не обязательно одинаковое количество) цветовых вложений, и если моя маска GL_COLOR_BUFFER_BIT
какого цвета вложения (GL_COLOR_ATTACHMENT0
, GL_COLOR_ATTACHMENT1
...., GL_COLOR_ATTACHMENTi
) это копирует? Все они? Если да, что если к этим FBO прикреплено разное количество цветовых буферов?
Предположим, что есть 2 FBO, которые связаны таким образом:
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2);
Обратите внимание, что fbo1
имеет 2 цветовых вложения и fbo2
имеет 4 цветовых вложения.
Так как же glBlitFrameBuffer
блит цвет вложений в этом случае?
Я не мог найти это нигде в документации OpenGL.
2 ответа
Операция цветового бликования кадрового буфера будет считываться только с текущегоglReadBuffer
для GL_READ_FRAMEBUFFER
, и он будет писать только вglDrawBuffers
указано для GL_DRAW_FRAMEBUFFER
, Так что дело не в привязанности; речь идет о буферах чтения и рисования двух кадровых буферов.
Это старая тема, но недавно я столкнулся с той же проблемой. Ранее принятый ответ по-прежнему работает, но вы должны восстановить буферы чтения / записи после операции blit, поскольку это часть состояния буфера кадра.
Для тех, кто использует OpenGL версии 4.5 и выше, вы можете воспользоваться новой функцией прямого доступа к состоянию, которая использует
// transfer pixels data between color attachments
glNamedFramebufferReadBuffer(in, GL_COLOR_ATTACHMENT0 + in_buff_id);
glNamedFramebufferDrawBuffer(out, GL_COLOR_ATTACHMENT0 + out_buff_id);
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
// transfer pixels data between depth buffers
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
// transfer pixels data between stencil buffers
glBlitNamedFramebuffer(in, out, 0, 0, width, height, 0, 0, width, height, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
Я не тестировал производительность, но разница должна быть тривиальной (надеюсь).