OpenGL ES 2.0 — несколько эффектов пост-обработки

Привет

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

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

Шаги, которые я сейчас прохожу, следующие:

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

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

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

0

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]