Копирует ли 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);

Я не тестировал производительность, но разница должна быть тривиальной (надеюсь).

Другие вопросы по тегам