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

0

 

Реализовать альфа-смешивание в 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, в котором нет альфа-канала на пиксел, а второй раз – применяя изображение bobargb8888.png, содержащее информацию в альфа-канале. Обратите внимание, что формат PNG сохраняет пикселы в формате ARGB8888, а не в RGBA8888. К счастью, метод GLUti Is .texImage2D, который мы используем для загрузки данных о изображении текстуры, автоматически выполнит преобразование. В листинге 7.11 дан код нашего небольшого эксперимента с использованием классов Texture и Verti ces.

Листинг 7.11. Фрагмент из BlendingTest.Java; смешивание в действии

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

В методе present  очищаем экран, заполняя его красным цветом, и задаем матрицу проекции, как делали это раньше. Затем включаем альфа-смешивание и задаем соответствующее уравнение. Наконец, включаем нанесение текстуры и визуализируем два прямоугольника. Первый прямоугольник визуализируется с текстурой RGB888, а второй – с текстурой RGBA8888. Сохраняем оба прямоугольника в одном и том же экземпляре класса Vertices и используем смещение вместе с методами verti ces. drawO. На рис. 7.16 показан результат нашей работы.

Рис. 7.16. Боб: смешивание цвета вершин (сверху) и смешивание текстур (снизу)

В случае с RGB888-Bo6om смешивание происходит с применением альфа-значений цветов каждой вершины. Поскольку мы установили их как 0,5f, Боб на 50 % прозрачный.

В случае с RGBA8888-Bo6om альфа-значения цветов каждой вершины равны 1. Тем не менее, поскольку фоновые пикселы текстуры имеют альфа-значение 0 и поскольку цвета вершин и текселы модулируются, фон в этом варианте Боба не виден.

Если бы мы также установили альфа-значение цветов для каждой вершин 0,5f, то сам Боб тоже был бы на 50 % прозрачный, как и его копия в нижней части экрана. На рис. 7.17 показано, как бы это выглядело.

Рис. 7.17. Альтернативная версия RGBA8888 Боба, где альфа-значение, примененное поочередно к каждой из вершин, равно 0,5f (вверху)

Вот в общем-то и все, что нам надо знать о смешивании в 2D в OpenGL ES.

Однако есть еще один очень важный момент, на который я бы хотел обратить ваше внимание: смешивание потребляет очень много памяти. Не злоупотребляйте им. Современные мобильные графические процессоры не всегда хорошо справляются со смешиванием большого количества пикселов. Используйте смешивание только тогда, когда без него не обойтись.

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

По теме:

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