Подсчет сходства изображений на графическом процессоре [OpenGL/OcclusionQuery]
Вопрос
OpenGL.Допустим, я нарисовал одно изображение, а затем второе, используя XOR.Теперь у меня где-то есть черный буфер с нечерными пикселями, я читал, что я могу использовать шейдеры для подсчета черных [rgb (0,0,0)] пикселей на графическом процессоре?
Я также читал, что это должно быть как-то связано с OcclusionQuery.http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
Возможно ли это и как?[любой язык программирования]
Если у вас есть другая идея о том, как найти сходство с помощью OpenGL / GPU - это тоже было бы здорово.
Решение
Я не уверен, как вы выполняете бит XOR (по крайней мере, это должно быть медленно;Я не думаю, что какой-либо из современных графических процессоров ускоряет это), но вот моя идея:
- есть два входных изображения
- включите запрос на окклюзию.
- нарисуйте два изображения на экране (т. е.полноэкранный режим с двумя настроенными текстурами), с шейдером фрагментов, который вычисляет abs (texel1-texel2) и уничтожает пиксель (выбросить в GLSL), если пиксели являются тот же самый (разница равна нулю или ниже некоторого порога).Проще всего, вероятно, просто использовать GLSL fragment shader, и там вы просто считываете две текстуры, вычисляете abs () разницы и отбрасываете пиксель.Здесь достаточно самых элементарных знаний GLSL.
- получаем количество пикселей, по которым был передан запрос.Для одинаковых пикселей запрос не пройдет (пиксели будут отброшены шейдером), а для разных пикселей запрос пройдет.
Сначала я думал о более сложном подходе, который включает буфер глубины, но потом понял, что просто уничтожения пикселей должно быть достаточно.Вот мой оригинал (но приведенный выше вариант проще и эффективнее):
- есть два входных изображения
- очистить экран и буфер глубины
- нарисуйте два изображения на экране (т. е.полноэкранный режим с двумя настроенными текстурами), с шейдером фрагментов, который вычисляет abs (texel1-texel2) и уничтожает пиксель (выбросить в GLSL), если пиксели разные.Нарисуйте квадрат так, чтобы значение буфера глубины было чем-то близким к ближней плоскости.
- после этого шага буфер глубины будет содержать небольшие значения глубины для одинаковых пикселей и большие значения глубины (в дальней плоскости) для разных пикселей.
- включите запрос окклюзии и нарисуйте еще один четырехугольник во весь экран с глубиной ближе, чем дальняя плоскость, но больше, чем предыдущий четырехугольник.
- получаем количество пикселей, по которым был передан запрос.Для одинаковых пикселей запрос не пройдет (буфер глубины уже ближе), а для разных пикселей запрос пройдет.Вы бы использовали SAMPLES_PASSED_ARB, чтобы получить это.Пример запроса на окклюзию приведен по адресу CodeSampler.com чтобы вы могли начать.
Конечно, для всего этого требуется графический процессор с поддержкой окклюзионных запросов.Большинство графических процессоров с 2002 года или около того поддерживают это, за исключением некоторых недорогих (в частности, Intel 915 (он же GMA 900) и Intel 945 (он же GMA 950)).