Подсчет сходства изображений на графическом процессоре [OpenGL/OcclusionQuery]

StackOverflow https://stackoverflow.com/questions/99906

Вопрос

OpenGL.Допустим, я нарисовал одно изображение, а затем второе, используя XOR.Теперь у меня где-то есть черный буфер с нечерными пикселями, я читал, что я могу использовать шейдеры для подсчета черных [rgb (0,0,0)] пикселей на графическом процессоре?

Я также читал, что это должно быть как-то связано с OcclusionQuery.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

Возможно ли это и как?[любой язык программирования]

Если у вас есть другая идея о том, как найти сходство с помощью OpenGL / GPU - это тоже было бы здорово.

Это было полезно?

Решение

Я не уверен, как вы выполняете бит XOR (по крайней мере, это должно быть медленно;Я не думаю, что какой-либо из современных графических процессоров ускоряет это), но вот моя идея:

  1. есть два входных изображения
  2. включите запрос на окклюзию.
  3. нарисуйте два изображения на экране (т. е.полноэкранный режим с двумя настроенными текстурами), с шейдером фрагментов, который вычисляет abs (texel1-texel2) и уничтожает пиксель (выбросить в GLSL), если пиксели являются тот же самый (разница равна нулю или ниже некоторого порога).Проще всего, вероятно, просто использовать GLSL fragment shader, и там вы просто считываете две текстуры, вычисляете abs () разницы и отбрасываете пиксель.Здесь достаточно самых элементарных знаний GLSL.
  4. получаем количество пикселей, по которым был передан запрос.Для одинаковых пикселей запрос не пройдет (пиксели будут отброшены шейдером), а для разных пикселей запрос пройдет.

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

  1. есть два входных изображения
  2. очистить экран и буфер глубины
  3. нарисуйте два изображения на экране (т. е.полноэкранный режим с двумя настроенными текстурами), с шейдером фрагментов, который вычисляет abs (texel1-texel2) и уничтожает пиксель (выбросить в GLSL), если пиксели разные.Нарисуйте квадрат так, чтобы значение буфера глубины было чем-то близким к ближней плоскости.
  4. после этого шага буфер глубины будет содержать небольшие значения глубины для одинаковых пикселей и большие значения глубины (в дальней плоскости) для разных пикселей.
  5. включите запрос окклюзии и нарисуйте еще один четырехугольник во весь экран с глубиной ближе, чем дальняя плоскость, но больше, чем предыдущий четырехугольник.
  6. получаем количество пикселей, по которым был передан запрос.Для одинаковых пикселей запрос не пройдет (буфер глубины уже ближе), а для разных пикселей запрос пройдет.Вы бы использовали SAMPLES_PASSED_ARB, чтобы получить это.Пример запроса на окклюзию приведен по адресу CodeSampler.com чтобы вы могли начать.

Конечно, для всего этого требуется графический процессор с поддержкой окклюзионных запросов.Большинство графических процессоров с 2002 года или около того поддерживают это, за исключением некоторых недорогих (в частности, Intel 915 (он же GMA 900) и Intel 945 (он же GMA 950)).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top