Эффективная сумма пиксельных шейдеров всех пикселей

Как я могу эффективно рассчитать сумму всех пикселей в изображении с помощью пиксельного шейдера HSLS? Меня интересует Pixel Shader 2.0, который я мог бы вызвать как эффект шейдера WPF.


person luvieere    schedule 31.05.2010    source источник
comment
Что вы имеете в виду, говоря «сумма всех пикселей» - это сумма всех значений R / G / B или чего-то другого?   -  person Agnius Vasiliauskas    schedule 01.09.2010


Ответы (3)


Существует гораздо более простое решение, в котором не используются шейдеры: загрузить изображение как текстуру, создать цепочку mipmap и прочитать значение последнего mipmap (1x1 пиксель). Этот трюк широко используется в играх для расчета, например, средней яркости сцены (для применения тональной карты HDR). Это отличный трюк, если вы цените простоту и эффективность выше точности.

person The Fiddler    schedule 15.07.2010
comment
Как именно создать цепочку mipmap из изображения в WPF так же быстро, как применить пиксельный шейдер? - person luvieere; 15.07.2010
comment
Изменив размер изображения до 1x1 с помощью прямоугольного фильтра. - person The Fiddler; 16.07.2010
comment
Спасибо тебе за это. Мои текстуры несколько вырождены (высокоточное числовое БПФ), и использование треугольного фильтра вместо этого дало очень хорошие результаты (плюс-минус 1% от желаемого результата), что для меня достаточно. Однако коробочный фильтр был далеко. - person Thomas; 05.10.2013

Предполагая, что вы хотите суммировать значения каналов r / g / b в изображении (и предполагая, что вы можете уничтожить исходные пиксели), вот мое частичное решение:

  1. Каждый 10-й пиксель будет вычислять средний цвет 10 соседних пикселей и помещать этот усредненный цвет в изображение.
  2. Then in CPU side sum
    Pix_Value*10
    of each 10th pixel.

В этом случае мы получаем примерно 10-кратное ускорение по сравнению с суммированием значений пикселей только на стороне процессора.

person Agnius Vasiliauskas    schedule 01.09.2010
comment
Не нужно задействовать CPU, все можно делать на GPU. Неэффективно не описывает этот подход, он даже не учитывает стоимость связи CPU-GPU. -1 - person Thomas; 08.10.2013

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

ускоритель

Брахма

OpenTK Я не знаю состояние привязок OpenCL в OpenTK. Также стоит обратить внимание на другие технологии, такие как DirectCompute и CUDA.

person Kris    schedule 02.06.2010