J. Полоски уже появились, но они все еще слишком расплывчаты. Сделаем их | чисто черными и чисто белыми с помощью функции step. Если сравнить
Сглаживание процедурных текстур
переменную triangle со значением 0,5, функция будет всегда возвращать 0 при triangle, меньшем или равном 0,5, и 1 при triangle, большем 0,5. Вот этот код:
float square = step(0.5. triangle);
Рис. 14.3. Рисование полосок на сфере с помощью текстурной координаты 5: а - б принимается как непосредственное значение интенсивности; б- пилообразный эффект; в - абсолютное значение функции, обеспечивающее пилообразную функцию в виде треугольников1
Результат показан на рис. 14.4, а. Относительный размер полосок можно менять изменением порогового значения для функции step.
14.4.2. Аналитический отбор
На рис. 14.4, а уже видны отчетливые полоски, но алиасинг на краях тоже хорошо заметен. Функция step может возвращать значения 0 или 1, а не промежуточные, поэтому у полосок и получается зубчатый край. Увеличив разрешение изображения, мы добьемся только того, что размер зубцов уменьшится относительно размера объекта, но они не пропадут окончательно. Проблема в том, что функция step может выполнить только прямой переход от белого цвета к черному (см. рис. 5.11), поэтому невозможно избавиться от алиасинга путем увеличения частоты. Чтобы получить красивые полоски, нужно выполнить сглаживание в шейдере.
Рис. 14.4. Сглаживание краев полосок: а-функция step вызывает появление алиасинга; б- функция smoothstep с жестко заданной шириной вызывает сильную расплывчатость на экваторе, но недостаточную на полюсе; в- адаптивный метод позволяет выполнить сглаживание везде1
' Рисунок любезно предоставлен Бертом Фрейдснбергом, университет Магдебурга, 2002.
14.4. Пример сглаживания полосок Множество методов антиалиасинга основано на удалении высоких частот перед семплингом. Такой прием называется фильтрация верхних частот, так как верхние частоты удаляются, а нижние - остаются. Основной видимый эффект такой фильтрации - размытое изображение.