Как программно изменить альфа-канал текстурированного объекта в OpenGL ES 1.1 (iPhone)

Я использую OpenGL ES 1.1 на iPhone в течение 10 месяцев, и за это время я не смог выполнить одну, казалось бы, простую задачу: программное обесцвечивание текстурированного объекта. Чтобы не усложнять: как я могу альфа-затухание под управлением кода, простой 2D-треугольник, к которому применена текстура (с альфа-каналом). Я бы хотел, чтобы он появлялся / исчезал, пока он находится над сценой, а не на простом цветном фоне. Пока что единственная техника, которую я должен использовать, - это создать текстуру с несколькими предварительно затененными копиями текстуры на ней. (Ух)

Например, я не могу сделать это, используя образец кода Apple GLSprite в качестве отправной точки. Он уже текстурирует четырехугольник с текстурой, имеющей собственный альфа-канал. Я бы хотел, чтобы этот объект появлялся и исчезал.


person PewterSoft    schedule 15.10.2009    source источник


Ответы (2)


Может быть, я не правильно понимаю, но мне это кажется тривиальным, и я успешно справляюсь с этим своими приложениями. Путь:

  1. включить текстурирование и все необходимое
  2. включить смешивание: glEnable(GL_BLEND)
  3. выберите режим наложения glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
  4. установить цвет для смешивания с: glColor4f(r * a, g * a , b * a, a)
  5. нарисуй свою геометрию

Функция наложения предназначена для портера-даффа с использованием предварительно умноженных цветов / текстур. GL_TEXTURE_ENV_MODE должен быть установлен на GL_MODULATE, но это значение по умолчанию.

person Nikolai Ruhe    schedule 15.10.2009
comment
Благодаря некоторой помощи на форумах разработчиков Apple, я получил эту работу, используя другой вариант, спасибо! Кроме того, когда я попытался использовать GL_ONE вместо GL_SRC_ALPHA, это не исчезло для меня. - person PewterSoft; 15.10.2009
comment
Вот почему я явно указал предварительно умноженные цвета. Это нормальный способ обработки цветов в контекстах растровых изображений Quartz и, следовательно, в текстурах, загруженных в GL. Если ваши цвета не умножены до умножения, указанная вами функция смешивания работает должным образом (за исключением целевой альфы, но это обычно не имеет значения). - person Nikolai Ruhe; 15.10.2009

Решение Николая правильное; пожалуйста, не обращайте внимания на то, что я сказал на форумах Apple. Поскольку текстура предварительно умножена, цвет для каждой вершины должен быть таким же. Вам следует использовать GL_ONE, а не GL_SRC_ALPHA, и сделайте следующее:

glColor4f(1., 1., 1., myDesiredAlpha);
glColor4f(myDesiredAlpha, myDesiredAlpha, myDesiredAlpha, myDesiredAlpha);
person prideout    schedule 16.10.2009