OpenGL ES 2.0 - несколько эффектов пост-обработки - PullRequest
0 голосов
/ 12 сентября 2018

Привет

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

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

следующие шаги, которые я сейчас выполняю:

  1. Загрузка моего шейдера (ов) и получение нужного места для передачи моих данных
  2. Инициализация моего FBO
  3. Создание текстуры с использованием моих входных данных
  4. Привязка FBO
  5. Активация TEXTURE0 и привязка ранее созданной текстуры
  6. Отправка данных с использованием полученного местоположения
  7. Рисование полногоЭкран четырехъядерный и заставить его использовать мою программу шейдера
  8. Чтение текстуры FBO (с использованием glReadPixels) и сохранение результата в изображение
  9. Отмена привязки для очистки.

Из того, что я понимаю, мне нужно повторить шаг 5,6,7 с другим шейдером постобработки и используя текстуру, которую я наконец-то получил на шаге 8, но яНе думайте, что это правильный путь, так как это заставит меня читать данные из FBO в текстуру, а затем повторно передавать их, что действительно дорого.

Я что-то упустил?

1 Ответ

0 голосов
/ 13 сентября 2018

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

Однако многие эффекты постобработки должны воздействовать на конечный результат предыдущего прохода постобработки.Типичным решением является установка двух FBO и «пинг-понга» между ними.Таким образом, если бы у вас было 3 эффекта постобработки, которые нужно объединить в цепочку, у вас было бы 3 прохода:

  • Пропуск 1. Текстура = Входные данные, Шейдер = Эффект1, Цель визуализации = FBO A.
  • Пропуск 2. Текстура = FBO A, шейдер = Effect2, цель рендеринга = FBO B.
  • Пропуск 3. Текстура = FBO B, шейдер = Effect1, цель рендеринга = FBO A.

Думаю, вам не хватает того, что вы можете напрямую использовать текстуру из кадрового буфера, не создавая совершенно новую текстуру, заполненную данными из glReadPixels.Это руководство может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...