2010-05-31 3 views
6

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

+0

Что вы подразумеваете под словом «сумма всех пикселей» - это сумма всех значений R/G/B или что-то другое? –

ответ

-1

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

Accelerator

Brahma

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

6

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

+0

Как именно вы создаете цепочку mipmap из изображения в WPF, это так же быстро, как применение пиксельных шейдеров? – luvieere

+0

Изменив размер изображения, используя 1x1, используя фильтр окна. –

+0

Спасибо за это. Мои текстуры несколько вырождены (высокоточные числовые БПФ), и вместо этого использование треугольного фильтра дает очень хорошие результаты (плюс или минус 1% от желаемого результата), что достаточно для меня. Тем не менее, фильтр в коробке был выключен. – Thomas

3

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

  1. Каждый десятый пиксель будет рассчитать средний цвет 10 соседних пикселей и поместите этот усредненный цвет на изображение.
  2. Затем на стороне процессора сумма
    Pix_Value*10
    каждого 10-го пикселя.

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

+0

Это хороший, +1 – luvieere

+0

Не нужно привлекать процессор, все может быть сделано на GPU. «неэффективный» не начинает описывать этот подход, он даже не учитывает стоимость передачи CPU-GPU. -1 – Thomas

Смежные вопросы