// Каждая следующая строка сдвигается на половину кирпича if (fract(position.y * 0.5) > 0.5) position.х += 0.5:
// Вычисление размера фильтра fw = fwidth(position):
// Фильтрация с помощью интеграции двухмерного импульса //в шаблоне кирпичной стенки по ширине и высоте фильтра
14.5. Отбрасывание частот
useBrick = (Integral(position + fw. BrickPct. MortarPct) -Integral(position. BrickPct. MortarPct)) / fw:
// Определение окончательного цвета
color = mix(MortarColor. BnckColor, useBrick.x * useBrick.y); color *= Lightlntensity: gl_FragColor = vec4 (color. 1.0);
}
.5. Отбрасывание частот
Для некоторых функции рассмотренный в предыдущих разделах способ вычислений не подходит, и тут можно попробовать другой метод, называемый отбрасывание частот. Для замены конкретного значения функции в случае излишней ширины фильтра используется среднее значение функции. Это удобно для функций, среднее значение которых уже известно, например синуса и функции шума.
4.5.1. Фрагментный шейдер шахматной оски со сглаживанием Рисунок шахматной доски - удобный критерий проверки качества метода сглаживания (рис. 14.9). В листинге 14.3 приведен фрагментный шейдер для процедурного рисования шахматной доски со сглаживанием. Вершинный шейдер всего лишь преобразует координаты вершин и передает текстурные координаты. Приложение передает значения двух цветов шахматной доски, среднее значение этих двух цветов (приложение может вычислить его один раз и передать через uniform-переменную, чтобы не вычислять в шейдере для каждого фрагмента) и частоту чередования клеток.
Рис. 14.9. Шаблон шахматной доски. Рендеринг выполнен с помощью шейдера шахматной доски со сглаживанием. Слева ширина фильтра выставляется в 0, и получаются неровности. Справа ширина фильтра вычисляется функцией fwidth
Сглаживание процедурных текстур
Фрагментный шейдер вычисляет размер фильтра, а затем выполняет гладкое интерполирование между соседними клетками доски. Если фильтр слишком широкий (переменный параметр изменяется слишком быстро, чтобы можно было правильно использовать фильтр), подставляется среднее значение. Даже если во фрагментном шейдере есть условное выражение, все равно выполняется гладкое интерполирование между вычисленным и средним значениями цвета.