Результат расчета Pixel Bender по ВСЕМ пикселям

Я хочу (в основном) того же, что и «суммировать все пиксели изображения». Однако похоже, что шейдером этого не добиться (думаю, поэтому и спрашиваю ;-)):

Я хочу передать изображение + параметр «treehold» и проверить для каждого пикселя изображения, находится ли этот пиксель (R, G, B) в пороговом значении (R +/-, G +/-, B +/-).

Работа IS IN в порядке, ничего сложного.

Дело в том, что мне нужна СУММА всех пикселей (количество), которые выполнили это на изображении.

Идея использования шейдера состоит в том, чтобы минимизировать этот расчет, потому что в CPU очень дорого (к тому же нам приходится повторять это вычисление несколько раз).

Одна идея состоит в том, чтобы поместить в качестве вывода вектор (0,0,0), если пиксель не достигается, и (1,0,0), если пиксель достигает, тогда программно просуммируйте все первый канал.

Даже когда это быстрее, чем при использовании только программного обеспечения, мы все равно путешествуем с изображением NXM.

Другой способ (не очень точный) - это сделать это (например) для 10 соседних пикселей (и пропустить вычисление, если «я сосед»). Тогда мы только будем суммировать массив каждые 10 позиций. Делаем в 10 раз быстрее, но все равно O (N * M).

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

Заранее благодарим за любое другое решение.


person voskyc    schedule 07.10.2013    source источник
comment
Это проще сделать с помощью вычислительного шейдера, в котором вы можете работать с блоками изображения, а затем комбинировать результаты с помощью атомики. На какую платформу / оборудование вы нацеливаетесь?   -  person mattnewport    schedule 09.10.2013
comment
привет, я не понимаю вашего ответа. Мы работаем над Flash (pxiel bender), Flas имеет несколько важных ограничений voer pixel bender, в частности, у вас нет циклов или какой-либо другой управляющей структуры, кроме if, а еще, если у нас есть, я мог бы просто вычислить это с помощью простого for и askinf для ближайших пикселей. Спасибо.   -  person voskyc    schedule 09.10.2013


Ответы (1)


Возможно, вы захотите рассмотреть подход «разделяй и властвуй», запустив фильтр несколько раз.

Одна из возможностей - написать фильтр, который записывает сумму области 10x10, начиная с [(coord.x * 10.0), (coord.y * 10.0)]

Каждый проход этот фильтр будет уменьшать интересующую вас область до 1/10.

Итак, максимально возможный размер изображения во Flash составляет 8192 пикселя, вам придется запустить этот фильтр четыре раза, чтобы получить ответ в верхнем левом пикселе.

Вы можете оптимизировать его двумя способами. Во-первых, при каждом запуске после первого вы можете просто передать ему верхнюю левую десятую часть предыдущего выходного изображения, поэтому при каждом запуске требуется обрабатывать только 1% пикселей; во-вторых, вы можете передать параметр Float2, содержащий 1/10 ширины и высоты изображения, и пусть ваш код пропустит суммирование и просто установит выходной пиксель на 0, если координаты .x или corre.y находятся за пределами этого.

С этой оптимизацией ваш первый проход будет считываться в каждом пикселе; второй прочитает 1% пикселей; третий - 0,01%; а в финале будет 0,0001%. Таким образом, все проходы после первого не должны сильно увеличивать время обработки.

Все это предполагает, что вы используете алгоритм контрольной суммы, который МОЖЕТ иметь ответ, сжатый до одного пикселя, и где ноль не влияет на результаты. Побитовое XOR было бы идеальным, но побитовые операторы не существуют в PB. :(

person Dewi Morgan    schedule 08.09.2014