При умножении текстурной координаты s на 16 и отбрасывании целой части ' возникает пилообразный эффект (рис. 14.3, б), вызванный тем, что значение ин-I тенсивности сначала 0, потом резко поднимается до 1, а потом так же резко опуска-; ется до 0. (Чтобы понять, как выглядит пилообразный эффект, можно посмотреть на иллюстрации встроенных функций fract (см. рис. 5.6) и mod (см. рис. 5.7).) Это ' повторяется 16 раз. Код шейдера выглядит так:
float sawtooth = fract(V * 16.0): Полученные полоски - это не совсем то, чего мы ожидали. Теперь нужно взять : абсолютное значение функции (рис. 14.3, в). Умножая значение sawtooth на 2 и вы-j читая 1, получаем функцию, значение которой находится в диапазоне [-1,1 ]. Если : получится абсолютное значение функции, то оно будет меняться с 1 до 0 и потом : опять до 1 (колебания треугольной формы). Код выглядит так:
i float triangle = abs(2.0 * sawtooth - 1.0): Полоски уже появились, но они все еще слишком расплывчаты. Сделаем их ; чисто черными и чисто белыми с помощью функции step. Если сравнить переменную triangle со значением 0,5, функция будет всегда возвращать 0 при triangle, меньшем или равном 0,5, и 1 при triangle, большем 0,5. Вот этот код:
float square = step(0.5. triangle):
Рис. 14.3. Рисование полосок на сфере с помощью текстурной координаты s: a- s принимается как непосредственное значение интенсивности; б- пилообразный эффект; в - абсолютное значение функции, обеспечивающее пилообразную функцию в виде треугольников1
Результат показан на рис. 14.4, а. Относительный размер полосок можно менять изменением порогового значения для функции step.
14.4.2. Аналитический отбор
На рис. 14.4, а уже видны отчетливые полоски, но алиасинг на краях тоже хорошо заметен. Функция step может возвращать значения 0 или 1, а не промежуточные, поэтому у полосок и получается зубчатый край. Увеличив разрешение изображения, мы добьемся только того, что размер зубцов уменьшится относительно размера объекта, но они не пропадут окончательно. Проблема в том, что функция step может выполнить только прямой переход от белого цвета к черному (см. рис. 5.11), поэтому невозможно избавиться от алиасинга путем увеличения частоты. Чтобы получить красивые полоски, нужно выполнить сглаживание в шейдере.
Рис. 14.4. Сглаживание краев полосок: а- функция step вызывает появление алиасинга; б- функция smoothstep с жестко заданной шириной вызывает сильную расплывчатость на экваторе, но недостаточную на полюсе; в - адаптивный метод позволяет выполнить сглаживание везде1
Множество методов антиалиасинга основано на удалении высоких частот перед семплингом. Такой прием называется фильтрация верхних частот, так как верхние частоты удаляются, а нижние - остаются. Основной видимый эффект такой фильтрации - размытое изображение.
Чтобы избавиться от высоких частот в шаблоне полосок, воспользуемся функцией smoothstep. Получится плавный переход между белым и черным цветами. Чтобы добиться этого, нужно задавать две линии края, и плавный переход будет выполняться между этими линиями. На рис. 14.4, б показан результат выполнения следующей строки кода: