Использование двойного FBO переключения между несколькими FBO - PullRequest
0 голосов
/ 04 июля 2019

Я реализую приложение фильтра камеры, используя GLES, например, GPUImage, на мобильных устройствах.

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

Например, если я использую три фильтра для получения окончательного результата, тогда создайте 3 FBO. Привязать FBO1 и рисовать, затем привязать FBO2, используя рисование текстуры FBO1 и т. Д.

Однако, поскольку мне не нужно содержимое FBO1, когда я рисую на FBO3, используя текстуру FBO2, если я снова использую FBO1 вместо FBO3, мне не нужно создавать много FBO.

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

Я показываю пример кода ..

glBindFramebuffer(fbo1);
glClear();
glBindTexture(camera-texture);
draw();

glBindFramebuffer(fbo2);
glClear();
glBindTexture(fbo1-texture);
draw();

glBindFramebuffer(fbo3);
glClear();
glBindTexture(fbo2-texture);
draw();

...

or

If i swtich FBOs..

glBindFramebuffer(fbo1);
glBindTexture(camera-texture);
glClear();
draw();

glBindFramebuffer(fbo2);
glClear();
glBindTexture(fbo1-texture);
draw();

glBindFramebuffer(fbo1);
glClear();
glBindTexture(fbo2-texture);
draw();

...

1 Ответ

0 голосов
/ 04 июля 2019

Для производительности, я сомневаюсь, что это действительно имеет какое-то значение - вы делаете то же самое количество вызовов API.

Большая разница, вероятно, заключается в объеме памяти - циклическое переключение между небольшим количеством FBO и повторное использование их вложений в одном кадре уменьшит общее количество поверхностей, которые вам нужно выделить, по сравнению со схемой, в которой у вас есть уникальный вложений за один проход рендера.

...