Смешайте FBO с буфером кадра по умолчанию

Чтобы уточнить, когда я говорю «фреймбуфер по умолчанию», я имею в виду тот, который предоставляется оконной системой, и то, что заканчивается на вашем мониторе.

Чтобы повысить скорость рендеринга для приложения CAD, мне удалось отделить 3D-элементы от 2D-элементов, обрабатываемых Qt, и теперь каждый из них визуализируется в своем собственном FBO. Когда приходит время выводить их на экран, я наношу 3D FBO на FB по умолчанию, а затем хочу смешать поверх него 2D FBO.

Я хорошо добрался до блиттинговой части, но я не вижу, как смешать с ней мой 2D FBO? Оба FBO идентичны по размеру и формату, и они оба такие же, как FB по умолчанию.

Я уверен, что это простая операция, но я ничего не могу найти в сети — предположительно, мне не хватает правильного термина для того, что я пытаюсь сделать. Хотя я использую Qt, я могу без проблем использовать собственные команды OpenGL.


person cmannett85    schedule 23.01.2012    source источник


Ответы (3)


Блит-операция, в конечном счете, является операцией копирования пикселей. Если вы хотите наложить одно изображение поверх другого, вы не можете его наложить. Вместо этого вы должны визуализировать полноэкранный четырехугольник как текстуру и использовать правильные параметры смешивания для смешивания. операция.

person Nicol Bolas    schedule 23.01.2012
comment
Это просто кажется ужасно неэффективным, у меня есть два массива значений пикселей (буферов) одинакового размера, в конечном итоге все, что мне нужно сделать, это применить математическую операцию для объединения элемента одного из них с соответствующим элементом другого. Действительно ли OpenGL рассматривает FBO только как текстуры? - person cmannett85; 23.01.2012
comment
Рендеринг @ cbamber85 в текстуру не был бы таким уж неэффективным - person BЈовић; 23.01.2012
comment
@cbamber85: OpenGL действительно обрабатывает FBO только как текстуры? FBO — это просто контейнеры для изображений. Вы прикрепляете изображения к FBO, но они не принадлежат самому FBO. Изображения берутся из других объектов: текстур и буферов рендеринга. И каким бы неэффективным это ни казалось, рендеринг одного изображения поверх другого происходит чрезвычайно быстро. Нет преобразований вершин. Не более чем выборка текстуры во фрагментном шейдере. Кроме того, API не дает вам другого способа сделать это, поэтому он настолько эффективен, насколько это возможно. - person Nicol Bolas; 23.01.2012
comment
Ну, если это способ сделать это, я не могу спорить. - person cmannett85; 23.01.2012
comment
@ cbamber85: текстурный квадроцикл НАМНОГО быстрее, чем блит. Кроме того, вы можете выполнить наложение и наложение за один проход, если возможно использование шейдера. Это снова будет НАМНОГО быстрее (один проход и без смешивания, т.е. требуется чтение-изменение-запись). - person Damon; 23.01.2012

Вы можете использовать GL_EXT_framebuffer_blit для разметки содержимого объект фреймбуфера в фреймбуфер приложения (или в любой другой). Хотя, как указано в спецификации, использование смешивания невозможно:

Копия пикселя обходит конвейер фрагментов. Единственными операциями с фрагментами, влияющими на блит, являются тест владения пикселем и тест ножниц.

Таким образом, любое смешивание означает использование фрагментного шейдера, как это было предложено. Один полноэкранный проход со смешиванием должен быть довольно дешевым, я считаю, что не о чем беспокоиться.

person the swine    schedule 23.01.2012

используйте шейдер для чтения из буфера кадра. это расширение OpenGL ES, не поддерживаемое всем оборудованием.

https://www.khronos.org/registry/gles/extensions/EXT/EXT_shader_framebuffer_fetch.txt

person lbsweek    schedule 07.10.2016