Пиксельные манипуляции в OpenGL

Допустим, у меня есть это изображение, и в нем есть объект (куб). Этот объект отслеживается (с метками), и мне удается отобразить на нем виртуальный куб (дополненная реальность). Теперь, когда я могу визуализировать на нем виртуальный куб, я хочу, чтобы объект «исчезал» с помощью некоторой действительно базовой техники уменьшенной реальности, называемой «рисование». Рассматриваемая окраска довольно проста (она должна быть, иначе пострадает FPS), и она требует от меня выполнения некоторых операций с пикселями и их соседями (например, с размытием по Гауссу или другой базовой обработкой изображения).

Для этого мне сначала нужно:

  1. Маска: черный фон с белым кубом.
  2. Получите доступ к каждому пикселю исходного изображения (в координатах x и y), а также к его окрестностям и сделайте вещи, основываясь на пиксельном значении маски с такими же координатами x и y. Таким образом, в основном маска служит способом сказать, игнорировать этот пиксель или использовать этот пиксель.

Как мне сделать это с помощью OpenGL? Я хочу иметь возможность доступа к значениям пикселей 1 на 1 предпочтительно в 2D из-за соседей.

Я использую FBO или PBO? Я прочитал много вещей о буферах и методах, таких как glDrawPixels() но у меня не получается собрать их все вместе. Бумага, в которой я видел этот метод, использовала GL_BACK Буфер но мой уже используется. Некоторый пример кода (C ++) был бы действительно признателен за все формальности (вызовы OpenG`), так как я все еще новичок в OpenGL.

Я даже думаю об использовании OpenCV, если в OpenGL слишком сложно манипулировать пикселями, поскольку моя библиотека AR (Aruco) работает поверх OpenCV. В этом случае мне все еще нужно получить маску (белый куб на черном фоне), преобразовать ее в cv::Mat а затем сделайте мою обработку.

Я знаю, что этот подход неэффективен (возвращаясь назад и вперед от GPU / CPU), но моя цель (пока) состоит в том, чтобы, по крайней мере, заставить работать основы.

2

Решение

Настройте объект framebuffer для рендеринга вашего исходного изображения + виртуального куба. Вот руководство.

Затем вы можете прикрепить эту текстуру кадрового буфера как входную (сэмплерную) текстуру вашего следующего этапа и визуализировать квад (два треугольника), который покрывает вашу маску.

В фрагментном шейдере вы должны иметь возможность сэмплировать свою «координату экрана», читая переменную gl_FragCoord. Установив функции фильтра текстур как GL_NEAREST, вы можете получить доступ к точным координатам текстуры. Также соседние пиксели доступны со смещением (deltaX = 2 / Width, deltaY = 2 / Height).

Использование предыдущей текстуры кадрового буфера в качестве источника является обязательным, поскольку активный в данный момент кадровый буфер предназначен только для записи.

2

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

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