АЛЬФА-ЗМІШУВАННЯ: Я БАЧУ ТЕБЕ НАСКРІЗЬ – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Реалізувати альфа-змішування в OpenGL ES досить просто Потрібно викликати всього два методи:

Виклик першого методу повинен бути вам вже знайомий: він просто повідомляє OpenGL ES, що той повинен застосувати альфа-змішування до всіх трикутниках, які ми визуализируем з даного моменту Другий метод трохи складніше Він визначає, як повинні поєднуватися вихідний і кінцевий кольору Метод gl BIendFunc просто повідомляє OpenGL ES, який тип рівняння використовувати

Аналогічним чином Canvas виконує змішування з растровими малюнками Bitmap

Змішування в OpenGL ES – потужний і одночасно складний механізм Нас поки не цікавлять подробиці Просто використовуйте наведену вище функцію змішування скрізь, де хочете змішати трикутники з інформацією з фреймбуфер, так само, як ми змішували Bitmap з Canvas

Друге питання стосується того, звідки надходять вихідний і кінцевий кольору Останнє досить просто пояснити: це колір пікселя в фреймбуфер, який ми збираємося замінити при отрісовке трикутника Початковий колір фактично є поєднанням двох кольорів

Колір вершини Це колір, який ми визначаємо за допомогою gl Col or4f для всіх вершин або повершінно, додаючи властивість кольору до кожної вершини

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

Так що якщо трикутник не асоціюється з певною текстурою, вихідний колір для змішування буде дорівнює кольору вершини Якщо трикутник асоціюється з текстурою, вихідний колір для кожного пікселя трикутника являє собою суміш кольору вершини і кольору текстурного пікселя Ми можемо визначити, як поєднуються кольори вершини і текселов, використовуючи метод glTexEnvO За замовчуванням колір вершини модулюється кольором текселов Це означає, що два кольори множаться один на одного покомпонентно Для всіх випадків, описаних у цій е, такий метод підходить оптимально, так що не будемо заглиблюватися в роботу з glTexEnv Існує також кілька особливих ситуацій, в яких може знадобитися змінити принцип змішування кольору вершини і текселов Що стосується gl BI endFunc, ми ігноруємо деталі і скористаємося установками, заданими за замовчуванням

Коли ми завантажуємо зображення текстури, у якого немає альфа-каналу, OpenGL ES автоматично приймає, що значення альфа для кожного пікселя дорівнює 1 Якщо ми завантажуємо зображення у форматі RGBA8888, OpenGL ES буде використовувати для змішування надані альфа-значення

Для кольору вершин ми завжди визначаємо альфа-компонент окремо або за допомогою gl Color4f, де останній аргумент є альфа-значенням або за допомогою визначення чотирьох компонентів для кожної вершини, де знову ж таки останній компонент є альфа-значенням

Застосуємо отримані знання на практиці, звернувшись до невеликого прикладу Ми хочемо намалювати Боба двічі: один раз – використовуючи зображення bobrgb888 png, в якому немає альфа-каналу на піксель, а другий раз – застосовуючи зображення bobargb8888png, що містить інформацію в альфа-каналі Зверніть увагу, що формат PNG зберігає пікселі у форматі ARGB8888, а не в RGBA8888 На щастя, метод GLUti Is TexImage2D, який ми використовуємо для завантаження даних про зображенні текстури, автоматично виконає перетворення У лістингу 711 дан код нашого невеликого експерименту з використанням класів Texture і Verti ces

Лістинг 711 Фрагмент з BlendingTestJava змішування в дії

Наша невелика реалізація BlendingScreen містить один екземпляр класу Vertices, де ми будемо зберігати два прямокутника, а також два примірники класу Texture – один, що включає в себе 1ЮВА8888-зображення Боба, і другий, який містить 1ЮВ888-версію Боба Ми завантажуємо обидві текстури з файлів bobrgb888png і bobargb8888 png в конструктор і користуємося класами Texture і GLUti 1 s texImag2D, які переводять ARGB8888 PNG в RGBA8888, як того вимагає OpenGL ES Потім визначаємо наші вершини і індекси Перший прямокутник, що має чотири вершини, асоціюється з текстурою Боба RGB888 Другий прямокутник асоціюється з версією Боба RGBA8888 і візуалізується на 200 одиниць вище прямокутника RGB888 Зверніть увагу, що всі вершини першого прямокутника мають колір (1 1 1 0,5 f), а вершини другого прямокутника мають колір (1 1 1 1)

У методі present очищаємо екран, заповнюючи його червоним кольором, і задаємо матрицю проекції, як робили це раніше Потім включаємо альфа-змішування і задаємо відповідне рівняння Нарешті, включаємо нанесення текстури і визуализируем два прямокутники Перший прямокутник візуалізується з текстурою RGB888, а другий – з текстурою RGBA8888 Зберігаємо обидва прямокутника в одному і тому ж примірнику класу Vertices і використовуємо зміщення разом з методами verti ces drawO На рис 716 показаний результат нашої роботи

Рис 716 Боб: змішування кольору вершин (зверху) і змішування текстур (знизу)

У випадку з RGB888-Bo6om змішування відбувається із застосуванням альфа-значний квітів кожної вершини Оскільки ми встановили їх як 0,5 f, Боб на 50% прозорий

У випадку з RGBA8888-Bo6om альфа-значення кольорів кожної вершини рівні 1 Проте, оскільки фонові пікселі текстури мають альфа-значення 0 і оскільки кольору вершин і текселов модулюються, фон в цьому варіанті Боба не видний

Якби ми також встановили альфа-значення кольорів для кожної вершин 0,5 f, то сам Боб теж був би на 50% прозорий, як і його копія в нижній частині екрана На рис 717 показано, як би це виглядало

Рис 717 Альтернативна версія RGBA8888 Боба, де альфа-значення, застосоване почергово до кожної з вершин, дорівнює 0,5 f (угорі)

Ось загалом-то і все, що нам треба знати про змішування в 2D в 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>

*

*