GL_DRAW / READ_FRAMEBUFFER против GL_FRAMEBUFFER? - PullRequest
9 голосов
/ 17 декабря 2011

Я заметил, что теперь есть расширения GL_DRAW / READ_FRAMEBUFFER.В настоящее время я просто использую GL_FRAMEBUFFER и glTextureBarrierNV.Однако я не нашел так много о расширениях READ / WRITE, и поэтому у меня есть несколько вопросов.

Какую версию OpenGL они представили?Какие преимущества они дают по сравнению с использованием просто GL_FRAMEBUFFER для чтения и записи?Где я могу найти больше информации об этом?

Ответы [ 2 ]

13 голосов
/ 17 декабря 2011

педантичное примечание: GL_DRAW/READ_FRAMEBUFFER не были введены в расширение;они являются основной функциональностью OpenGL 3.0.Да, технически эта функциональность также представлена ​​в ARB_framebuffer_objects, но это расширение ядра , и оно все еще является ядром GL 3.0.

В любом случае, если вы хотите этимологию DRAW/READ различие, вам нужно посмотреть EXT_framebuffer_blit .Вот откуда появились эти перечислители, и именно поэтому эти перечислители существуют.Вместо того, чтобы просто указывать два FBO для перенаправления из / в, они создали две точки привязки контекста для кадровых буферов.Команда glBlitFramebuffer переходит от текущей привязки READ_FRAMEBUFFER к текущей привязке DRAW_FRAMEBUFFER.

Если вы не используете blit, тогда вам действительно не нужно необходимость DRAW/READ различие.Это не значит, что вы не должны использовать его, однако.glReadPixels читает из READ_FRAMEBUFFER.Привязка к GL_FRAMEBUFFER привязывает обе точки, поэтому ваш код все еще может работать.Но иногда полезно иметь привязку FBO, из которой можно прочитать, что не мешает операциям рисования.

3 голосов
/ 17 декабря 2011

Если вы имеете в виду константы GL_READ_FRAMEBUFFER и GL_DRAW_FRAMEBUFFER, они получены из расширения EXT_framebuffer_blit , которое позже стало ядром в OpenGL 3.0 и в специальное расширение ARB_framebuffer_object (вместе с EXT_framebuffer_multisample и оригинальным EXT_framebuffer_object, конечно) для версий <3. </p>

Они позволяют вам связывать отдельные FBO для операций чтения и рисования. Это особенно полезно для операций копирования FBO в FBO, введенных EXT_framebuffer_blit (которые позволяют копировать данные непосредственно из одного FBO в другое), и для разрешения мультисэмплированных FBO, введенных (и необходимых) в EXT_framebuffer_multisample, что фактически создает на вершине вышеупомянутого блитового расширения. Привязывая FBO к GL_FRAMEBUFFER, вы фактически привязываете его к GL_READ_FRAMEBUFFER и GL_DRAW_FRAMEBUFFER.

Как уже говорилось, все эти расширения FBO были сделаны ядром в OpenGL 3.0, но также могут быть доступны для более ранних версий. Смотрите здесь для получения дополнительной информации.

...