Обработка изображения текстуры на графическом процессоре? - PullRequest
6 голосов
/ 08 января 2009

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

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

Это жизнеспособный курс действий? это обычное дело? Может быть, есть лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 08 января 2009

Да, это нормальный способ обработки изображений. Цвет квадратора не имеет большого значения, если вы будете устанавливать цвет для каждого пикселя. В зависимости от вашего приложения вам может потребоваться соблюдать осторожность в вопросах выборки пикселей (т. Е. Обеспечить выборку с точно правильного пикселя исходной текстуры, а не между двумя пикселями).

2 голосов
/ 08 января 2009

Да, это обычный способ ведения дел.

  1. Визуализация чего-либо в текстуре.
  2. Нарисуйте полноэкранный квад с шейдером, который читает эту текстуру и выполняет некоторые операции.

Простые эффекты (например, оттенки серого, коррекция цвета и т. Д.) Могут быть выполнены путем считывания одного пикселя и вывода одного пикселя в фрагментный шейдер. Более сложные операции (например, вихревые шаблоны) могут быть выполнены путем считывания одного пикселя из местоположения смещения и вывода одного пикселя. Еще более сложные операции можно выполнить, прочитав несколько пикселей.

В некоторых случаях потребуется несколько временных текстур. Например. размытие с большим радиусом часто делается следующим образом:

  1. Визуализация в текстуру.
  2. Визуализация в другую (меньшую) текстуру с шейдером, который вычисляет каждый выходной пиксель как среднее значение для нескольких исходных пикселей.
  3. Используйте эту меньшую текстуру для рендеринга в другую небольшую текстуру с шейдером, который делает правильное размытие по Гауссу или что-то в этом роде.
  4. ... повтор

Во всех вышеперечисленных случаях каждый выходной пиксель должен быть независимым от других выходных пикселей. Он может просто использовать еще один входной пиксель.

Примером операции обработки, которая не отображается должным образом, является Summed Area Table, где каждый выходной пиксель зависит от входного пикселя и значения смежного выходного пикселя. Тем не менее, можно делать такие виды на графическом процессоре ( пример pdf ).

...