Как обновить текстуру необработанного содержимого, применив к нему фильтр OpenGL? - PullRequest
0 голосов
/ 29 ноября 2018

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

1 Ответ

0 голосов
/ 29 ноября 2018

Что вы имеете в виду под «фильтром OpenGL»?Существуют фильтры выборки текстур (GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAG_FILTER и т. Д.).Применять их к текстуре не имеет смысла, поскольку они определяют способ получения данных при выборке текстуры в областях между центрами текселей.Однако, если вы хотите применить какой-либо фильтр Гаусса (или любой другой фильтр свертки) к текстуре, используя конвейер OpenGL (ES), вы можете использовать концепцию под названием «Render to Texture».Идея состоит в том, чтобы визуализировать в текстурный объект вместо «видимого» кадрового буфера по умолчанию.

В OpenGL (ES) это можно сделать с помощью Framebuffer Objekt (сокращенно FBO):

  1. Создание FBO ( glGenFramebuffers )
  2. Привязка FBO ( glBindFramebuffer )
  3. Присоединение целевой текстуры к FBO (glFramebufferTexture2D )
  4. (Проверьте, завершено ли FBO (готово) ( glCheckFramebufferStatus )
  5. Установите область просмотра в соответствии с разрешением текстуры вашего FBO

Теперь вы рендеритесь в целевую текстуру. Просто нарисуйте квадрат заполнения экрана с вашей входной текстурой, и результат окажется в целевой текстуре.

Чтобы вернуться к вызову кадрового буфера по умолчанию glBindFramebuffer(0)

Некоторые примечания:

  • Вы не должны читать текстуру, на которую пишете! Поэтому используйте два разных объекта текстуры для входной и целевой текстур!
  • В этой настройке вы не будете иметь глубину илиТеннисный буфер!Если вам нужно, добавьте один, используя Renderbuffer или прикрепите текстуру глубины к FBO.
...