Я сделал это с помощью вершинного и фрагментного шейдера.
Я объявляю точечную вершину для каждого пикселя в текстуре и отрисовываю их.
Я объявляю текстуру рендеринга за пределами экрана, которая является 1D и равна длине желаемого количества сегментов. Вы можете сделать это 1 сегмент, но это замедлит вас, пока каждый фрагмент ожидает записи в один и тот же пиксель. Я обнаружил, что 32 обычно работает довольно хорошо для меня.
Установите режим смешивания на добавку.
В вершинном шейдере я модифицирую gl_VertexID по количеству сегментов и устанавливаю этот диапазон в диапазоне от -1 <-> 1.
Пример текстуры для каждой вершины (которая на самом деле равна каждому пикселю) и установите для gl_Color значение white для действительного пикселя и черного для not (в основном 1 или 0).
Сделайте обратный просмотр на 1D текстуру и суммируйте значения. Это будет количество пикселей.
Второй способ, которым я занимался в прошлом, - это сделать первый проход к внеэкранной текстуре того же размера, что и входные данные, и классифицировать входные данные как 1 или 0. Затем визуализируем текстуру с половиной ширина и высота и образец 4 раза добавить и написать. Продолжайте делать это, пока не дойдете до 1x1 и не прочитаете значение обратно.