Редко бывает так что бы пиксели текстуры один в один совпадали с пикселями на экране, при отображении текстуры. Обычно либо один пиксель растянут на несколько экранных пикселей (
texture magnification – картинка текстуры растянута) либо наоборот несколько пикселей текстуры влияют на цвет одного экранного пикселя (
texture minification – картинка текстуры ужата). Часто, на одном полигоне некоторые пиксели текстуры нужно увеличить, а некоторые уменьшить (графические карты могут обеспечить оба действия на одном полигоне).
Вы можете контролировать, как будет выглядеть текстура при растяжении и сжатии установив тип фильтра.
Code
texture.setMagfilter(filterType)
texture.setMinfilter(filterType)
Есть отдельные значения filterType для растяжения и сжатия. Для обоих случаев filterType может быть:
Texture.FTNearest - Брать за образец ближайший пиксель.
Texture.FTLinear - Брать за образец 4 ближайших пикселя и линейно интерполировать их.
Только для сжатия в дополнение к этим двум filterType может быть:
Texture.FTNearestMipmapNearest - Берет за образец пиксель из ближайшего слоя mipmap.
Point sample the pixel from the nearest mipmap level.
Texture.FTLinearMipmapNearest - Билинейно фильтрует пиксель из ближайшего слоя mipmap.
Bilinear filter the pixel from the nearest mipmap level.
Texture.FTNearestMipmapLinear - Берет за образец пиксели из двух слоев mipmap и линейно их смешивает.
Point sample the pixel from two mipmap levels, and linearly blend.
Texture.FTLinearMipmapLinear - Билинейно фильтрует пиксель из двух слоев mipmap и линейно смешивает результаты (триленейная фильтрация).
Bilinearly filter the pixel from two mipmap levels, and linearly blend the results. This is also called trilinear filtering.
Дефолтное значение filterType для обоих случаев FTLinear.
Рассмотрим разные типы фильтров при растяжении и сжатии на примере следующей текстуры:
FTNearest
Code
texture.setMagfilter(Texture.FTNearest)
texture.setMinfilter(Texture.FTNearest)
Обычно FTNearest используется чтобы достичь эффекта пикселизации.
FTLinear
Code
texture.setMagfilter(Texture.FTLinear)
texture.setMinfilter(Texture.FTLinear)
FTLinear – хороший выбор для многих целей, но не идеальный.
Mipmaps
Многие графические туториалы подробно распишут что такой мипмапинг и как он работает изнутри. Мы избавим вас от подробностей, но следующие вещи о мипмапинге нужно понимать:
(1) Он требует на 33% больше текстурной памяти, но рендерится быстрее.
(2) Он делает текстуру гораздо более сглаженной при сжатии
(3) Мипмапинг ничего не делает с растяжением текстур
(4) У него есть тенденция размывать сжатые текстуры слишком сильно, особенно если полигон с текстурой находится под большим углом к камере.
Существует четыре разных типа фильтров применяющих мипмапинг, но вы почти всегда предпочтете последний – FTLinearMipmapLinear. Остальные режимы для продвинутых пользователей, и иногда могут использоваться для сокрытия артифактов при мипмапинге (особенно для снижения эффекта описанного в 4 пункте выше). Если вы не поняли описания типов фильтров выше – не стоит беспокоиться.
Code
texture.setMinfilter(Texture.FTLinearMipmapLinear)
Anisotropic Filtering
Есть еще одно последнее дополнение к фильтрации текстур: вы можете применить анизотропную фильтрацию поверх любого из вышеперечисленных типов, которая использует более тяжелый и медленный режим рендеринга, обеспечивающий наилучший результат. В общем случае, анизотропную фильтрацию лучше применять при сжатии текстуры, чем при мипмаппинге и она не слишком сильно сглаживает текстуру.
При включении анизотропной фильтрации вы определяете её степень (degree):
Code
texture.setAnisotropicDegree(degree)
Степень должна быть типа integer. Значение по умолчанию – 1, что означает отсутствие анизотропной фильтрации; установите большее значение, что бы задать силу фильтрации, которая вам требуется. Большие значения понижают производительность, но повышают качество вплоть до предела возможностей вашей видео карты. Многие видеокарты не поддерживают степень анизотропной фильтрации больше 2, но обычно этого достаточно.
Code
texture.setAnisotropicDegree(2)
Некоторые старые видеокарты не поддерживают анизотропную фильтрацию.