Сложность заключается также в том, что OpenGL требует, чтобы текстуры имели размеры, кратные степени двойки и по ширине, и по высоте (такие изображения в наше время - редкость). Чтобы обойти это ограничение, можно увеличить изображение до следующей ближайшей степени двойки, а затем соответственно сдвинуть текстурные координаты на прямоугольнике. Это может привести (а может и не привести) к излишнему расходованию текстурной памяти, что зависит от того, поддерживает ли графический ускоритель виртуальное текстури-рование (загрузка части текстур в графическое оборудование по запросу). Существуют расширения от разных производителей, с помощью которых эту проблему пытаются решить. OpenGL ARB работает над тем, чтобы создать общее решение и включить его в стандарт OpenGL.
16.7.1. Сглаживание Операции сглаживания изображений нужны для того, чтобы приглушить высокие частоты. Общая операция сглаживания называется усреднение соседних элементов. Этот метод использует ядро свертки со значением 1,0 в каждой точке. Окончательная сумма делится на количество точек в ядре. Например, сверточный фильтр для усреднения размером 3x3 выглядит примерно так:
1 1 1
1 1 1
1 1 1
Окончательная сумма делится на 9 (или умножается на 1/9). Этим методом вычисляется среднее значение окружающих заданную точку пикселов. В результате изображение получается более мягким, размытым.
Так как все элементы ядра равны 1, можно написать упрощенный фрагмент-ный шейдер для усреднения (листинг 16.7). Этот шейдер можно использовать для ядра любого размера, где width height < 25 (например, 5 х 5). Результаты работы этого шейдера показаны на рис. 16.1, б.
Листинг 16.7. Фрагментный шейдер для свертки методом усреднения
// Максимальный размер для данного шейдера const int MaxKernelSize = 25:
16.7. Свертка
// Массив со значениями сдвигов для доступа к основному изображению uniform vec2 Offset[MaxKernelSize];
// Размеры ядра (width * height) uniform int Kernel Size;
// Масштаб
uniform vec4 ScaleFactor;
// Основное изображение uniform sampler2D Baselmage;