Обробки текстур: ЛЕГКА РОБОТА З фоновим малюнком – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Коли ми писали Містера Нома, ми завантажили ряд растрових зображень і безпосередньо відправили їх в фреймбуфер – без поворотів, тільки злегка змінивши масштаби, що було досить нескладно У OpenGL ES нас в основному цікавлять трикутники, які можуть мати будь-яку орієнтацію і розмір залежно від поставленого завдання Як же візуалізувати зображення за допомогою OpenGL ES

Все досить просто: завантажте зображення в OpenGL ES (точніше – передайте на обробку графічному процесору, який має свою виділену RAM), додайте нові властивості кожної вершині трикутника і накажіть OpenGL ES візуалізувати наш трикутник і застосувати зображення (або текстуру, кажучи мовою OpenGL ES) до нашого трикутнику Розглянемо спочатку, що визначають ці нові властивості вершин

Координати текстур

Щоб асоціювати растрове зображення з трикутником, спочатку потрібно додати до кожної вершини трикутника так звані координати текстур Що ж таке координата текстури Вона визначає точку всередині текстури (растрового зображення, яке ми завантажили), яка буде асоційована з однією з вершин трикутника Координати текстур, як правило, задаються для двох вимірів

Координати місця розташування позначають буквами х, у і z, а текстури координат зазвичай називають і v або s і t У OpenGL ES їх позначають s і t, так що ми будемо дотримуватися цієї назви Якщо ви читаєте будь-які статті в Інтернеті, які використовують назви u / v, не переживайте це те ж саме, що і s і t Як же виглядає система координат На рис 710 показаний Боб в текстурної системі координат після того, як ми завантажили його в OpenGL ES

Тут відбувається кілька цікавих речей Насамперед, s одно координаті х в стандартній системі координат, а г, в свою чергу, так само координаті у Вісь s спрямована вправо, а вісь t – вниз Початок системи координат збігається з лівим верхнім кутом зображення Боба Нижній правий кут зображення має координати (1 1)

Що ж сталося з пиксельной системою координат Як виявилося, OpenGL ES не особливо її любить Будь-яке зображення, яке ми завантажуємо, незалежно від його ширини і висоти в пікселах, вставляється в дану систему координат Верхній лівий кут зображення завжди буде знаходитися в точці (0, 0), а нижній правий кут – в (1 1), навіть якщо його ширина вдвічі більше висоти Це називається нормалізованими координатами Вони насправді іноді значно полегшують нам життя Так як же асоціювати Боба з нашим трикутником Все просто, ми присвоюємо кожній вершині трикутника пару текстурних координат в координатної системі Боба На рис 711 показані кілька конфігурацій

Рис 710 Боб, завантажений в OpenGL ES і показаний в текстурної системі координат

Рис 711 Три різних трикутника, нанесених на Боба координати vi, v2 і v3 вказують вершини трикутника

Ми можемо асоціювати вершини трикутника з системою текстурних координат так, як захочемо Зверніть увагу, що орієнтація трикутника в системі позиційних координат може не збігатися з орієнтацією в системі текстурних координат

Дані системи координат ніяк не повязані Розглянемо, як додати ці координати текстур до наших вершин:

Нескладно, правда Все, що нам залишилося зробити, – переконатися, що у нас вистачає місця в буфері, а потім застосувати координати текстур до кожної вершини Попередній код відповідає самому правому варіанту асоціації, показаному на рис 710 Зверніть увагу, що положення наших вершин і раніше даються в звичайній системі координат, яку ми описали за допомогою проекції При бажанні ми могли б також додати кожній вершині колірні атрибути, як у попередньому прикладі Потім OpenGL ES змішає інтерпольовані кольору вершин з квітами пікселів тієї текстури, з якою асоціюється трикутник Це відбувається динамічно Природно, нам потрібно налаштувати розмір буфера, а також, відповідно, константи VERTEXSIZE (наприклад, (2 + 4 + 2) 4)) Щоб повідомити OpenGL ES, що у наших вершин є текстурні координати, ми знову використовуємо методи gl Enabl eCl ientState і glTexCoordPointer, які функціонують так само, як gl VertexPointer і gl ColorPointer (бачите закономірність)

Відмінно, все виглядає знайомим Залишається всього лише одне питання: як нам завантажити текстури в OpenGL ES і вказати асоціювати їх з трикутником Природно, це трохи складніше, однак теж не складає праці

Завантаження растрових зображень

Для початку необхідно завантажити наше растрове зображення Ви вже знаєте, як це робиться в Android:

Тут ми завантажуємо Боба в конфігурації RGB888 Потім нам потрібно повідомити OpenGL ES, що ми хочемо створити нову текстуру Щоб створити обєкт текстури, можна викликати наступний метод:

Перший параметр визначає, як багато обєктів текстур ми хочемо створити Зазвичай створюємо всього одну Наступний параметр – це масив i nt, куди OpenGL ES буде записувати ID згенерованих обєктів текстур

Останній параметр просто повідомляє OpenGL ES, з якої точки масиву потрібно починати записувати ID

Ви вже знаєте, що OpenGL ES – це API мовою С Природно, він не може повернути нам Java-обєкт, відповідний нової текстурі Замість цього він дає ID цієї текстури Кожен раз, коли ми хочемо, щоб OpenGL ES щось зробив з даною текстурою, ми вказуємо її ID Ось більш складний фрагмент коду, який демонструє, як згенерувати новий текстурний обєкт і отримати його ID:

Обєкт текстури і раніше порожній Це означає, що у нього як і раніше немає ніяких графічних даних Завантажимо наше растрове зображення Для цього нам необхідно спочатку привязати текстуру У OpenGL ES під привязкою чого-небудь розуміється, що ми хочемо, щоб OpenGL ES використовував даний конкретний обєкт для всіх наступних викликів до тих пір, поки ми знову не змінимо привязку У даному випадку ми хочемо привязати текстуру обєкта Для цього ми використовуємо метод gl BindTexture Як тільки привяжемо текстуру, зможемо управляти її властивостями, такими як дані про зображення Ось як завантажити Боба в наш новий обєкт текстури:

Спочатку ми привязуємо обєкт текстури за допомогою gl Bi ndTexture Перший параметр визначає тип текстури, яку ми хочемо привязати Наше зображення Боба – двомірне, тому ми використовуємо GL10 GL TEXTURE 2D Існують і інші типи текстур, але в цій е вони нам не знадобляться Ми завжди застосовуємо GI 10GL TEXTURE 2D для методів, яким необхідна інформація, з яким типом текстури ми хочемо працювати Другий параметр даного методу – ID текстури Коли метод виконається, всі наступні методи, які працюють з двомірної текстурою, будуть працювати з нашим обєктом текстури

При наступному виклику ми активуємо метод класу GLUti Is, цей клас надається під фреймворці Android Зазвичай завдання завантаження зображення текстури досить складна, проте цей невеликий допоміжний клас значно все полегшує Все, що потрібно зробити, – визначити тип текстури (GL10 GL TEXTURE 2D), рівень деталізації (ми докладно розглянемо його в главі 11, за замовчуванням він дорівнює нулю), зображення, яке ми хочемо завантажити, і ще один аргумент, який повинен бути рівний нулю у всіх випадках Після цього виклику до обєкта текстури будуть прикріплені графічні дані

ПРИМІТКА

Обєкт текстури і його графічні дані фактично зберігаються у відеопамяті, а не у звичайній оперативної памяті Обєкт текстури (і графічні дані) будуть загублені при втраті контексту OpenGL ES (коли наша активність ставиться на паузу, а потім поновлюється) Це означає, що треба буде заново відтворювати обєкт текстури і заново завантажувати графічні дані щоразу, коли створюється контекст OpenGL ES Якщо ми цього не зробимо, то побачимо тільки білий трикутник

Джерело: 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>

*

*