float square = smoothstep(0.5 - edge. 0.5 + edge, triangle): gl_FragColor = vec4 (vec3 (square). 1.0);
}
При масштабировании частоты текстуры соответственно должна увеличиваться ширина фильтра. Вычисленное значение функции записывается в красный, зеленый и синий компоненты вектора типа vec3 и используется в качестве цвета фрагмента. Результат применения метода показан на рис. 14.4, в, размытость более равномерно распределена по сфере. Затем проводятся несложные вычисления освещения, и окончательное изображение накладывается на чайник (рис. 14.6).
Рис. 14.6. Эффект адаптивного аналитического сглаживания на чайниках разных размеров. Для сравнения верхние чайники нарисованы без сглаживания. При рисовании нижних чайников использовался описанный шейдер. Сглаживание краев полосок выглядит хорошо в обоих масштабах. Но на краях объектов дефекты изображения все же видны
Метод работает хорошо, пока ширина фильтра не превысит частоту, что и происходит на северном полюсе сферы. Полоски возле полюса получаются намного
Сглаживание процедурных текстур
тоньше одного пиксела, и функция step не может здесь иметь нормальное значение. В таких областях объекта нужно применять интегрирование или ограничение частоты (оба метода будут описаны в дальнейшем).
14.4.4. Аналитическое интегрирование Средневзвешенное значение функции в заданном интервале называется свёрткой. Исходные данные для вычисления средневзвешенного значения называются ядро свёртки или свёрточный фильтр. В некоторых случаях можно определить свёртку функции заранее и в дальнейшем использовать для семплинга результат этих вычислений, а не функцию-оригинал. Свёртку в вычислениях можно выполнять через определенный промежуток, как если бы свёртка входной функции происходила через прямоугольный фильтр. Этот способ далек от идеала, но прост, в нем легко выполнять вычисления, и зачастую этого достаточно для улучшения качества изображения.
Описанный метод называется методом зонального семплинга; в нем некоторые вычисления зависят от того, в какой зоне заданного объекта находятся текущие координаты. Если этот метод будет использоваться применительно к изображению, приведенному на рис. 14.2, то для каждого конкретного пиксела будут вычислены более точные значения.