14.3. Увеличение разрешения
Эффект алиасинга можно уменьшить с помощью довольно грубого метода, называемого супердискретизацией, при котором анализируются несколько значений цвета для каждой ячейки наложенной сетки (пиксела), а потом выбирается среднее значение. Метод используется в современных графических ускорителях в буфере мультисемплинга. Этот метод сглаживания заменяет семплинг одной точки семплингом нескольких, поэтому некоторый алиасинг все равно остается, но он намного менее заметен. В принципе, если шейдерЫ используются совместно с буфером мультисемплинга, то оставшийся небольшой алиасинг можно игнорировать.
Так как этот способ незначительно использует ресурсы графического ускорителя (например, память), он может работать медленнее, чем применение антиалиасинга в процедурной текстуре. Мы не полностью избавляемся от алиасинга, но проявляется он уже на более высокой частоте.
Описанная процедура иллюстрируется рис. 14.2. Для каждого из пикселов цвет определяется четыре раза, затем вычисляется среднее значение. Конечно, рисунок стал выглядеть лучше, но еще недостаточно хорошо, так как мелкие детали все равно не видны.
Рис. 14.2. Супердискретизация с четырьмя пробами цвета на пиксел дает хорошие результаты, но полностью от алиасинга не избавляет: а - форма объекта для рендеринга; 6- семплинг выполняется четыре раза для одного пиксела; в - средний результат. Некоторые пикселы, на которые объект попал только одним семплом, считаются имеющими цвет фона Суперсемплинг также можно реализовать во фрагментном шейдере. Код для вычисления цвета фрагмента можно написать как функцию, которая вызывается несколько раз из главной функции и получает цвет нескольких мест фрагмента. Затем вычисляется окончательный цвет фрагмента как среднее значение. Недостаток такого метода - вызов функции Л^раз, где N - количество семплов, вычисляемых для каждого фрагмента.
I Иногда случается, что алиасинга избежать невозможно, а суперсемплинг не-[ допустим. Если нужно выполнять процедурное текстурирование и для этого [ должен использоваться единственный шейдер, тут мало что можно сделать, [ но лучше постараться написать шейдеры таким образом, чтобы сглаживание все S же выполнялось.
14.4. Пример сглаживания полосок
; Алиасинг возникает при попытке представить непрерывное изображение на эк-f ране. Это происходит при растеризации, и попытки смягчить дефекты выполня-> ются во фрагментном шейдере. В языке шейдеров OpenGL для этого есть несколько [ функций, доступных только из фрагментного шейдера. Чтобы продемонстриро-| вать в этом примере несколько приемов борьбы с алиасингом, придумаем наихуд-' ший вариант - чередование черных и белых полос на сфере. Разработка фраг-\ ментного шейдера, выполняющего сглаживание, поможет проиллюстрировать ; проблему алиасинга и методы борьбы с ним.
14.4.1. Рисование полос
; Фрагментный шейдер для сглаживания будет определять цвет фрагмента (чер-; ный или белый) для создания полос на поверхности объекта. Сначала нужно оп-: ределить метод рисования линий. Для этого можно передавать один параметр, пусть это будет координата s текстурных координат объекта. Вершинный шейдер ■ будет передавать это значение как varying-переменную V, представляющую собой } число с плавающей запятой, что позволит использовать текстурную координату s 1 как интенсивность цвета (полутон) на поверхности сферы (рис. 14.3, а). Точка I обзора находится чуть выше сферы, и зритель смотрит на «северный полюс». Тек-; стурная координата s начинается с 0 (черный цвет) и увеличивается до 1 (белый ; цвет), и так вокруг всей сферы. Черно-белый край виден возле полюса; передний край сферы в основном серый, но интенсивность увеличивается слева направо.