Главная » Программирование игр под Android » MIР-ТЕКСТУРИРОВАНИЕ – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

Если вы достаточно поработали с предыдущими примерами и отодвинули куб подальше от камеры, вы могли заметить, что текстуры начинают выглядеть зернисто и наполняются небольшими артефактами по мере уменьшения куба. Этот эффект называется наложением, или алайзингом, – известный эффект, присутствующий при всех типах обработки сигналов. На рис. 11.8, справа показан этот эффект, а на рис. 11.8, слева – результат применения приема, который называется mip-текстурированием.

Рис. 11.8. Алайзинговые артефакты (справа) и результат применения mip-текстурирования (слева)

Я не буду вдаваться в детали, почему происходит алайзинг; все, что вам нужно знать, – это способ, позволяющий преодолеть его. Он называется mip-текстурированием. Ключ к решению проблем, вызванных алайзингом, – использование изображений с низким разрешением для тех частей объекта, которые выглядят меньше на экране или располагаются дальше от точки обзора. Это часто называют пирамидой или цепью mip-текстур. Основываясь на разрешении изображения по умолчанию, например 256 х 256 пикселов, мы создаем его меньшие версии, деля каждую его сторону на 2 на каждом уровне пирамиды mip-текстур. На рис. 11.9 показана текстура ящика на различных уровнях mip-текстур.

Чтобы создать mip-текстуру с помощью OpenGL ES, необходимо выполнить два следующих действия: установить значение минимизирующего фильтра равным одной из констант, имеющих вид GL XXX MIPMAP XXX (обычно GL LINEARJMIPMAP NEAREST); создать изображения для каждого уровня цепи mip-текстур, изменяя размер оригинального изображения, и загрузить их в OpenGL ES. Цепь mip-текстур прикрепляется к одной текстуре, а не к нескольким.

Рис. 11.9. Цепочка mip-текстур

Для изменения размера базового изображения для цепи mip-текстур можно использовать классы Bitmap и Canvas, которые предоставляет Android API. Немного изменим класс Texture (листинг 11.8).

Листинг 11.8. Класс Texture.java, финальная версия класса Texture

Добавился только один новый член, который называется mi pmapped. Он хранит информацию о том, имеет ли текстура цепь mip-текстур.

Для совместимости мы сохранили старый конструктор, в котором вызывается новый. Новый конструктор принимает третий аргумент, который позволяет определить, необходимо ли текстуре быть mip-текстурированной.

Метод 1oad остается практически без изменений. Он лишь дополнен вызовом метода create Mipmaps  на случай, если текстура должна быть mip-текстурированной. Не являющиеся таковыми экземпляры класса Texture создаются так же, как и раньше.

Метод createMipmaps довольно прямолинеен. Начинаем работу с привязки к текстуре, чтобы затем можно было изменять ее атрибуты. Первое, что нам нужно сделать, – отслеживать .ширину и высоту бинарного изображения и установить фильтры. Обратите внимание, для минимизирующего фильтра мы применили константу GL LINEAR MIPMAP NEAREST. Если мы не будем использовать этот фильтр, mip-текстурирование не сработает и OpenGL ES будет задействовать обычную фильтрацию, используя только базовое изображение.

Содержимое цикла whi1е довольно прямолинейно. Мы загружаем текущее bitmap как изображение для текущего уровня. Мы начинаем с уровня 0, базового уровня оригинального изображения. Как только изображение для текущего уровня загружено, мы создаем меньшую его версию, разделив его ширину и высоту на 2. Если новая ширина меньше или равна нулю, мы выходим из бесконечного цикла, поскольку изображения для всех уровней mip-текстур уже загружены (последнее изображение имеет размеры 1×1 пиксел). Мы используем класс Canvas для изменения размеров изображения и сохраняем результат в переменной newBitmap. Затем удаляем старое изображение для того, чтобы очистить всю занимаемую им память, и устанавливаем текущее изображение, равное newBitmap. Этот процесс повторяется, пока изображение не станет меньше, чем 1×1 пиксел. Наконец, отвязываем текстуру и удаляем последнее изображение, созданное в цикле.

Остальная часть класса не изменяется по сравнению с предыдущей версией. Единственное различие в использовании – способ вызова конструктора. И поскольку этот класс очень прост, мы не будем писать пример для иллюстрации работы только лишь mip-текстурирования. Мы используем mip-текстурирование на всех текстурах, применяемых для ЗО-объектов. В двух измерениях mip-текстурирование задействуется реже. Несколько заключительных замечаний, касающихся mip-текстурирования.

Mip-текстурирование может увеличить производительность, если рисуемые с помощью mip-текстуры объекты малы. Причина заключается в том, что GPU приходится получать меньшее количество текселов из меньших изображений пирамиды mip-текстурир. Поэтому мудрым решением является постоянное использование mip-текстур для тех объектов, которые могут уменьшиться.

Mip-текстуры занимают до 33 % больше памяти, чем аналогичные не mip-текстурированные версии. Этот обмен зачастую справедлив.

Mip-текстурирование работает только для квадратных текстур, если вы используете OpenGL ES версии 1.x. Это важно помнить. Если ваши объекты остаются белыми, даже несмотря на то, что для них использована текстура с отличным изображением, вы можете быть уверены, что забыли об этом ограничении.

ПРИМЕЧАНИЕ

Повторю еще раз, поскольку это действительно важно. Mip-текстурирование будет работать только  с квадратными текстурами. Изображение, имеющее размер 512 х 256 пикселов, не подойдет.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии