Листинг 14.3. Исходный код шейдера шахматной доски со сглаживанием
uniform vec3 Colorl: uniform vec3 Color2: uniform vec3 AvgColor; uniform float Frequency:
varying vec2 TexCoord;
void main(void) {
vec3 color;
// Определение ширины проекции одного пиксела в пространстве s-t vec2 fw = fwidth(TexCoord):
// Определение степени размытости vec2 fuzz = fw * Frequency * 2.0;
float fuzzMax = max(fuzz.s, fuzz.t):
// Определение координат шаблона шахматной доски vec2 checkPos = fract(TexCoord * Frequency):
if (fuzzMax < 0.5) {
// Если ширина фильтра слишком маленькая, вычисляется цвет шаблона vec2 р = smoothstep(vec2 (0.5), fuzz + vec2 (0.5), checkPos) + (1.0 - smoothstep(vec2(0.0). fuzz. checkPos)):
color = mix(Colorl. Color2. p.x * p.у + (1.0 - p.x) * (1.0 - p.y)):
// Постепенное изменение цвета к среднему при приближении к краю color = mix(color. AvgColor, smoothstep(0.125, 0.5. FuzzMax));
}
else
{
// В противном случае используется только средний цвет color = AvgColor:
}
gl_FragColor = vec4(color, 1.0):
}
14.6. Итоги Больше свободы - больше ответственности. Язык шейдеров OpenGL позволяет вычислять любые процедурные текстуры. Можно легко написать шейдер, который
14.7. Ссылки будет рисовать изображение с уродливыми неровностями и дефектами изображения (обычно в нем используются только условные выражения и функция step), но избавиться от этих проблем будет куда труднее. После общего описания нескольких проблем в этой главе были рассмотрены методы сглаживания процедурных текстур. Некоторые возможности языка помогают выполнять сглаживание, например встроенные функции для гладкой интерполяции (smoothstep), для производных (dFdx, dFdy) и для вычисления ширины фильтра (fwidth). Эти функции широко используются в шейдерах, выполняющих сглаживание с помощью фильтрации, адаптивной фильтрации, интегрирования и отбрасывания частот.
4.7. Ссылки В большинстве книг по обработке сигналов и изображений обсуждаются принципы семплинга, преобразований и дефектов изображения. Книги [10, 12 и 16] могут служить дополнительными справочниками по этой теме. Технические записи Альви Рэя Смита[13-15] описывают проблему дефектов изображения непосредственно для компьютерной графики.