void main(void) {
int i;
vec4 sum = vec4 (0.0);
for (i =0: i < Kernel Size: i++)
sum += texture2D(BaseImage. gl_TexCoord[0].st + 0ffset[i]):
gl_FragColor = sum * ScaleFactor;
}
Этот способ сглаживания обычно применяется для уменьшения шума. Прием хорошо работает в областях сплошного цвета или интенсивности, однако получается побочный эффект размывания краев областей. Избежать этой проблемы поможет сверточ-ный фильтр, например фильтр Гаусса, который можно задать в ядре таким образом:
1/273 | 4/273 | 7/273 | 4/273 | 1/273 |
4/273 | 16/273 | 26/273 | 16/273 | 4/273 |
7/273 | 26/273 | 41/273 | 26/273 | 7/273 |
4/273 | 16/273 | 26/273 | 16/273 | 4/273 |
1/273 | 4/273 | 7/273 | 4/273 | 1/273 |
В листинге 16.8 приведен код для более общего шейдера свертки. Этот шейдер может работать с ядрами, содержащими до 25 элементов. В этом шейдере каждый элемент ядра должен умножаться на коэффициент масштабирования, поэтому не нужно масштабировать сумму.
Листинг 16.8. Фрагментный шейдер для общих вычислений свертки
// Максимальный размер ядра, поддерживаемый этим шейдером const int MaxKernelSize = 25:
// Массив со значениями сдвигов для доступа к основному изображению uniform vec2 Offset[MaxKernelSize];
// Размеры ядра (width * height) uniform int Kernel Size;
// Значение для каждой точки ядра uniform vec4 KernelValue[MaxKernelSize];
// Основное изображение
uniform sampler2D Baselmage; продолжение &
Шейдеры для обработки изображения
Листинг 16.8 (продолжение)
void main(void) {
int і :
vec4 sum = vec4 (0.0);
for (і = 0; і < KernelSize; i++) {
vec4 tmp = texture2D(BaseImage. gl_TexCoord[0],st + Offset[i]); sum +- tmp * Kernel Value[i]:
}
gl_FragColor = sum;
}
К исходному изображению (рис. 16.1, а) добавили шум, и получилось то, что изображено на рис. 16.1, е. Затем шум был удален с помощью фильтра Гаусса, результат показан на рис. 16.1, г. Следует заметить, что шум значительно уменьшился в областях с относительно постоянной интенсивностью.

Рис. 16.1. Результаты различных операций: а- исходное черно-белое изображение 512 х 512; б - усреднение 5x5 соседних пикселов; в - добавление шума к оригиналу; г - понижение шума фильтром Гаусса