Я пытаюсь изучить шейдеры для реализации чего-то в моем приложении для iPhone. До сих пор я понял простые примеры, такие как создание цветного изображения в сером масштабе, пороговое значение и т. Д. Большинство примеров включают простые операции, в которых обработка входного пикселя изображения I(x,y)
приводит к простой модификации цветов того же пикселяГауссовский фильтр с шейдерами OpenGL
Но, как насчет Convolution ?. Например, самым простым примером будет гауссовский фильтр:
, где выходной пиксель изображения O(x,y)
зависит не только от I(x,y)
, но и от окружающих 8 пикселей.
O(x,y) = (I(x,y)+ surrounding 8 pixels values)/9;
Как правило, это невозможно сделать с одним буфером изображения, иначе входные пикселы будут меняться при выполнении фильтра. Как я могу сделать это с помощью шейдеров? Кроме того, должен ли я сам обрабатывать границы? или есть встроенная функция или что-то, что проверяет недопустимый доступ к пикселям, например I(-1,-1)
?
Заранее спасибо
PS: Я буду щедрым (читай: дать много точек);)
Использование преимуществ линейной интерполяции не является чем-то новым. Где преимущество обычного более простого способа? Поиск в координатах [-4, -2, 0, 2, 4], чтобы получить 10-пиксельный диапазон, а затем применить взвешивание каждых двух текселей? – djmj
@djmj - Я не уверен, что я последую за тобой. Что более простой способ вы имеете в виду? Назовите те тексели, о которых вы говорите? У вас есть ссылка, на которую вы можете указать, что описывает этот подход? –
См .: http://drilian.com/journal/images/TextureGrid.png. Если вы пробуете на (2, 0,5), вы получите билинейное интерполированное значение пикселя (1, 0) и (2, 0). Сэмплирование в (2, 1) вы получите среднее значение 4 соседних пикселей!Поэтому просто используйте смещение в 2 пикселя, а затем примените гауссовский вес. – djmj