Копирование мультисэмплированного FBO с добавлением нескольких цветов в OpenGL

У меня есть объект фрейм-буфера в программе OpenGL с прикрепленными несколькими цветами, и я пытаюсь обновить его до FBO с множественной выборкой.

Насколько я понимаю, FBO с множественной выборкой может использовать только буферы рендеринга, в частности, созданные с использованием glRenderbufferStorageMultisampleEXT. Если я хочу, чтобы что-то визуализировалось в этом FBO в текстуре, мне нужно создать второй FBO с текстурами для его вложений, а затем преобразовать мультисэмплированный FBO в обычный FBO, используя glBlitFramebufferEXT.

Очень и очень редкие примеры, которые я видел, предполагают привязку одного цвета. Что мне делать, если я хочу скопировать многоцветные вложения?


person Aaron    schedule 21.11.2009    source источник


Ответы (2)


Из EXT_framebuffer_blit спецификации

12) Следует ли нам добавить поддержку нескольких буферов чтения, чтобы можно было скопировать несколько буферов цвета с помощью одного вызова BlitFramebuffer?

Решено: Нет, мы рассмотрели это, но поведение трудно определить, а функциональные возможности имеют ограниченное использование.

Из arb_framebuffer_object спецификации (которая заменяет версию EXT_)

Когда цветовой буфер передается, значения берутся из буфера чтения считывающего буфера кадра и записываются в каждый из буферов рисования буфера кадра рисования, как и в случае CopyPixels.

Итак ... Совершенно ясно, что вы разрешаете только один цветной буфер на один блит.

Чтобы выполнить несколько операций, вам нужно выполнить Blit для каждого буфера, изменив свой READ_BUFFER для каждого буфера, который вы хотите преобразовать, и выбрать соответствующий буфер рисования для буфера кадра рисования.

person Bahbar    schedule 24.11.2009

Вы можете создать новый Fbo и назначить ему рендербуфер в слоте 1 в слоте 0. Затем выполнить привязку для чтения и перенастроить его на конечный целевой Fbx.

то есть Fbo может быть создан исключительно для привязки существующего буфера рендеринга, в который был записан другой Fbo. Fbo фактически не владеет буферами, которые к нему подключены, поэтому несколько Fbx могут быть привязаны к одним и тем же текстурам / буферам рендеринга (но не одновременно).

// Рендеринг в Fbo0 Fbo0: [ColorBuffer0, ColorBuffer1, DethBuffer]

// Связываем другой fbo с ColorBuffer1 в слоте 0 для чтения Fbo1: [ColorBuffer1]

// копирование Fbo0 ColorBuffer0> Fbo2 Texture0 Fbo0: [ColorBuffer0, ColorBuffer1, DethBuffer] => Fbo2: [Texture0]

// копирование Fbo1 ColorBuffer1 (привязано к слоту 0)> Fbo3 Текстура1 (привязано к слоту 0) Fbo1: [ColorBuffer1] => Fbo3: [Текстура1]

person Philip Taylor    schedule 14.11.2017