f ший вариант - чередование черных и белых полос на сфере. Разработка фраг| ментного шейдера, выполняющего сглаживание, поможет проиллюстрировать
! проблему алиасинга и методы борьбы с ним.
14.4.1. Рисование полос
i Фрагментный шейдер для сглаживания будет определять цвет фрагмента (чер-[ ный или белый) для создания полос на поверхности объекта. Сначала нужно оп-î ределить метод рисования линий. Для этого можно передавать один параметр, | пусть это будет координата s текстурных координат объекта. Вершинный шейдер ; будет передавать это значение как varying-переменную V, представляющую собой | число с плавающей запятой, что позволит использовать текстурную координату s [ как интенсивность цвета (полутон) на поверхности сферы (рис. 14.3, а). Точка I обзора находится чуть выше сферы, и зритель смотрит на «северный полюс». Тек-[ стурная координата s начинается с 0 (черный цвет) и увеличивается до 1 (белый \ цвет), и так вокруг всей сферы. Черно-белый край виден возле полюса; передний ! край сферы в основном серый, но интенсивность увеличивается слева направо.
При умножении текстурной координаты .s на 16 и отбрасывании целой части | возникает пилообразный эффект (рис. 14.3, б), вызванный тем, что значение ин- тенсивности сначала 0, потом резко поднимается до 1, а потом так же резко опуска-J ется до 0. (Чтобы понять, как выглядит пилообразный эффект, можно посмотреть [ на иллюстрации встроенных функций fract (см. рис. 5.6) и mod (см. рис. 5.7).) Это ; повторяется 16 раз. Код шейдера выглядит так:
[ float sawtooth = fract(V * 16.0):
I Полученные полоски - это не совсем то, чего мы ожидали. Теперь нужно взять ; абсолютное значение функции (рис. 14.3, в). Умножая значение sawtooth на 2 и вы-; читая 1, получаем функцию, значение которой находится в диапазоне [-1, 1]. Если [ получится абсолютное значение функции, то оно будет меняться с 1 до 0 и потом [ опять до 1 (колебания треугольной формы). Код выглядит так:
f float triangle = abs(2.0 * sawtooth - 1.0):