Подсчитать сходство изображений на GPU [OpenGL / OcclusionQuery] - PullRequest
2 голосов
/ 19 сентября 2008

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

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

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

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

1 Ответ

2 голосов
/ 19 сентября 2008

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

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

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

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

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

...