MIР-текстуруванні – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Якщо ви досить попрацювали з попередніми прикладами і відсунули куб подалі від камери, ви могли помітити, що текстури починають виглядати зернисто і наповнюються невеликими артефактами в міру зменшення куба Цей ефект називається накладенням, або алайзінгом, – відомий ефект, присутній при всіх типах обробки сигналів На рис 118, праворуч показаний цей ефект, а на рис 118, ліворуч – результат застосування прийому, який називається mip-текстуруванням

Рис 118 Алайзінговие артефакти (праворуч) і результат застосування mip-текстурирования (ліворуч)

Я не буду вдаватися в деталі, чому відбувається алайзінг все, що вам потрібно знати, – це спосіб, що дозволяє подолати його Він називається mip-текстуруванням Ключ до вирішення проблем, викликаних алайзінгом, – Використання зображень з низьким дозволом для тих частин обєкта, які виглядають менше на екрані або розташовуються далі від точки огляду Це часто називають пірамідою або ланцюгом mip-текстур Грунтуючись на дозволі зображення за замовчуванням, наприклад 256 х 256 пікселів, ми створюємо його менші версії, ділячи кожну його сторону на 2 на кожному рівні піраміди mip-текстур На рис 119 показана текстура ящика на різних рівнях mip-текстур

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

Рис 119 Ланцюжок mip-текстур

Для зміни розміру базового зображення для ланцюга mip-текстур можна використовувати класи Bitmap і Canvas, які надає Android API Трохи змінимо клас Texture (лістинг 118)

Лістинг 118 Клас Texturejava, фінальна версія класу 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 версії 1x Це важливо памятати Якщо ваші обєкти залишаються білими, навіть незважаючи на те, що для них використана текстура з відмінним зображенням, ви можете бути впевнені, що забули про це обмеження

ПРИМІТКА

Повторю ще раз, оскільки це дійсно важливо Mip-текстурирование буде працювати тільки з квадратними текстурами Зображення, що має розмір 512 х 256 пікселів, не підійде

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*