Как я могу эффективно рассчитать сумму всех пикселей в изображении с помощью пиксельного шейдера HSLS? Меня интересует Pixel Shader 2.0, который я мог бы вызвать как эффект шейдера WPF.
Эффективная сумма пиксельных шейдеров всех пикселей
Ответы (3)
Существует гораздо более простое решение, в котором не используются шейдеры: загрузить изображение как текстуру, создать цепочку mipmap и прочитать значение последнего mipmap (1x1 пиксель). Этот трюк широко используется в играх для расчета, например, средней яркости сцены (для применения тональной карты HDR). Это отличный трюк, если вы цените простоту и эффективность выше точности.
Предполагая, что вы хотите суммировать значения каналов r / g / b в изображении (и предполагая, что вы можете уничтожить исходные пиксели), вот мое частичное решение:
- Каждый 10-й пиксель будет вычислять средний цвет 10 соседних пикселей и помещать этот усредненный цвет в изображение.
- Then in CPU side sum
Pix_Value*10
of each 10th pixel.
В этом случае мы получаем примерно 10-кратное ускорение по сравнению с суммированием значений пикселей только на стороне процессора.
Эффекты в WPF гораздо лучше подходят для получения визуального результата. Похоже, вы хотите использовать их для другого типа вычислений, для этого вам нужно будет обработать результат изображения как данные, для этого потребуется RenderTargetBitmap, что в любом случае будет выполнено в программном обеспечении. Возможно, вы захотите взглянуть на эти проекты, разработанные для GPGPU.
OpenTK Я не знаю состояние привязок OpenCL в OpenTK. Также стоит обратить внимание на другие технологии, такие как DirectCompute и CUDA.