Создание фильтра размытия с помощью шейдера - доступ к смежным пикселям из фрагмента шейдера? - PullRequest
10 голосов
/ 27 июля 2011

Я хочу создать эффект размытия, используя фрагментный шейдер в OpenGL ES 2.0.Алгоритм, который меня интересует, это просто усреднение размытия - добавьте все смежные пиксели себе и разделите на 9, чтобы нормализовать.

Однако у меня есть 2 проблемы:

1) Требуется ли для этого сначала рендеринг в кадровый буфер, а затем переключение целей рендеринга?Или есть более простой способ

2) предположить, что я привязываю свое «исходное» изображение к размытию как текстуру 0, и я вывожу свою размытую текстуру.Как получить доступ к пикселям, с которыми я не имею дело в данный момент.Вершинный шейдер вызвал меня для пикселя i, но мне нужно получить доступ к пикселям вокруг меня.Как?И как я узнаю, что я на грани (буквально на краю экрана)

(3: есть ли более подходящий алгоритм для получения размытого матового стекла, выглядящего размытым)

Ответы [ 2 ]

11 голосов
/ 01 августа 2011

Расскажите немного подробнее о том, что сказал Матиас:

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

  2. Вы получаете координаты текущего пикселя в специальной переменной фрагмента шейдера gl_FragCoord и используете их в качестве координат текстуры в текстуре, содержащей ранее визуализированное изображение, а также gl_FragCoord.x +/- 1 и gl_FragCoord.y +/- 1 для соседей. Но, как сказал Матиас, вам нужно разделить эти значения на ширину и высоту (изображения) соответственно, так как координаты текстуры находятся в [0,1]. Используя GL_CLAMP_TO_EDGE в качестве режима обтекания для текстуры, крайние случаи автоматически обрабатываются аппаратным обеспечением для текстурирования. Таким образом, по краю вы все равно получаете 9 значений, но только 6 различных (остальные 3, те, которые на самом деле находятся за пределами изображения, являются просто дубликатами их внутренних соседей).

1 голос
/ 29 июля 2011

1) Да, использование FBO - это путь.

2) С математикой, если вы находитесь в пикселе (x, y), то соседями являются (x + 1, y), (x, y + 1), (x + 1, y + 1), ( x-1, y) и т. д. Крайние случаи обрабатываются с помощью режимов обтекания текстуры. Обратите внимание, что поскольку GL_TEXTURE_2D использует нормализованные координаты, смещения не 1, а 1 / ширина и 1 / высота текстуры.

...