Подсчет текселей с помощью фрагментного шейдера

У меня есть две текстуры, созданные с использованием фрагментного шейдера. Я хочу иметь возможность подсчитывать количество текселей в каждой текстуре, интенсивность цвета которых превышает некоторую.

Как это может быть сделано?

Моя первоначальная мысль заключалась в том, чтобы подсчитать эти текселы с помощью фрагментного шейдера перед созданием текстуры. Однако для этого потребуется какой-то глобальный счетчик. Я не могу использовать запросы окклюзии, потому что текстуры создаются из других текстур. Я использую OpenGL 2.1.


person Brett    schedule 13.04.2010    source источник


Ответы (3)


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

  1. Включить запросы окклюзии
  2. Рендеринг изображения с использованием фрагментного шейдера и discard текселей ниже требуемой интенсивности цвета.
  3. Получить количество текселей, прошедших тест рисования, из запроса
person Brett    schedule 14.04.2010
comment
Это действительно работает? Документ кажется очень ясным, что discard не имеет значения opengl.org/wiki/Query_Object#Occlusion_queries - person Alec Jacobson; 24.04.2015
comment
Вроде до сих пор работает. Так что, возможно, документ просто сбит с толку. - person Alec Jacobson; 27.04.2015

Вы всегда можете запустить пиксельный шейдер в буфере кадра, который устанавливает все пиксели выше порогового значения в белый цвет, а остальные — в черный. Затем возьмите изображение фреймбуфера и посчитайте количество белых пикселей...

Я предполагаю, что вам не нужно будет делать это каждый кадр. Если да, то вам, вероятно, придется изменить свои требования...

person Mikepote    schedule 13.04.2010
comment
Да, это нужно делать каждый кадр. Ну, примерно 500 раз на 30 кадров в секунду. - person Brett; 13.04.2010
comment
Только что нашел этот stackoverflow.com/ вопросов/99906/, чего я и пытаюсь добиться. Я хочу подсчитать сходство между изображениями. Кто-нибудь знает эту технику? Это работает? - person Brett; 13.04.2010

Я сделал это с помощью вершинного и фрагментного шейдера.

Я объявляю точечную вершину для каждого пикселя в текстуре и визуализирую их.

Я объявляю закадровую текстуру рендеринга, которая является 1D и имеет длину нужного мне количества сегментов. Вы можете сделать это 1 ведро, но это замедлит вас, пока каждый фрагмент ожидает записи в один и тот же пиксель. Я обнаружил, что 32 обычно работает очень хорошо для меня.

Установите режим наложения на аддитивный.

В вершинном шейдере я изменяю gl_VertexID на количество сегментов и устанавливаю этот диапазон между -1‹->1.

Выберите текстуру для каждой вершины (которая на самом деле равна каждому пикселю) и установите для gl_Color белый цвет для действительного пикселя и черный цвет для нет (в основном 1 или 0).

Сделайте считывание 1D-текстуры и просуммируйте значения. Это будет количество пикселей.

Второй способ, который я делал в прошлом, состоит в том, чтобы сделать первый проход к закадровой текстуре того же размера, что и ввод, и классифицировать ввод как 1 или 0. Затем выполните рендеринг в текстуру, которая имеет половину ширины и высоту и образец 4 раза добавить и написать. Продолжайте делать это, пока не дойдете до 1x1 и не прочитаете значение.

person Jose    schedule 13.04.2010