Подсчет текселей с использованием фрагментного шейдера - PullRequest
1 голос
/ 13 апреля 2010

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

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

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

  1. Включить запросы окклюзии
  2. Рендеринг изображения с использованием фрагментного шейдера и discard необходимых текстовых полей ниже интенсивность цвета
  3. Получить количество текселей, прошедших проверку чертежа из запроса
0 голосов
/ 13 апреля 2010

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

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

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

Установите режим смешивания на добавку.

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

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

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

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

0 голосов
/ 13 апреля 2010

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

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

...