Чтобы избавиться от высоких частот в шаблоне полосок, воспользуемся функцией smoothstep. Получится плавный переход между белым и черным цветами. Чтобы добиться этого, нужно задавать две линии края, и плавный переход будет выполняться между этими линиями. На рис. 14.4, б показан результат выполнения следующей строки кода:

float square = smoothstep(0.4, 0.6. triangle):

Описанный в предыдущем подразделе способ сглаживания дает приемлемые результаты не во всех областях сферы. Размер фильтра сглаживания (0,2) определен как параметр. Но при постоянном размере экрана этот параметр не изменяется, а текстурная координата s меняется слишком быстро возле полюсов и слишком медленно - на экваторе. Из-за применения фильтра фиксированной ширины размывка затрагивает несколько пикселов на экваторе, но совсем не видна на полюсах. Нужно найти способ определять размер фильтра сглаживания в зависимости от координат на сфере, чтобы рисунок выглядел лучше. Для этого требуется знать, с какой скоростью должна меняться функция при изменении экранных координат.

К счастью, в языке шейдеров OpenGL есть встроенная функция скорости изменения (производная) любого параметра пространства. Функция dFdx определяет скорость изменения в направлении х, а функция dFdy - скорость изменения в направлении у. Так как эти функции работают с экранными координатами, они доступны только из фрагментного шейдера. С их помощью можно вычислить вектор-градиент нужных координат.

Для заданной функции f(x, у) градиент / в координатах (х, у) определен как вектор: Проще говоря, вектор-градиент включает в себя частную производную функции /по отношению к х (скорость изменения /в направлении х) и частную производную функции / по отношению к у (скорость изменения / в направлении у). Вектор-градиент всегда указывает в сторону наибольшей скорости увеличения функции /(х, у) (направление градиента), а модуль вектора представляет собой скорость увеличения функции в направлении градиента. (Эти значения тоже пригодятся для обработки изображения.) Встроенные функции с!Рс1х и с1Рс!у как раз и нужны для вычисления вектора-градиента функций фрагментного шейдера.


⇐ Предыдущая| |Следующая ⇒