OpenGL ES: как тонировать текстуру цветом - PullRequest
5 голосов
/ 19 декабря 2011

У меня есть текстура с альфа.И я хочу подкрасить его некоторым цветом, поэтому он будет окрашен в зависимости от альфа-значения цвета, но общая непрозрачность будет определяться только альфа-текстурой.

Это похоже на мультитекстурирование, но с цветом вместовторая текстура.Как это сделать?

(обновлено) Я попытался настроить комбинатор текстур.Цвет тонирован хорошо, но есть проблема с альфа-каналом - он не принимает значения из текстуры (например, маски).Мой код на данный момент:

glActiveTexture (GL_TEXTURE0); // do we need stage #1?
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_ALPHA);
// this doesn't work for alpha:
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

Скриншоты:

Нет тонировки:

enter image description here

Оттенок с RGBA = (0, 0,5,1, 0,5):

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 января 2012

Возможно, вы захотите прочитать документацию OpenGL по прозрачности, 15.020: «Как добиться эффекта прозрачности?»

Убедитесь, что вы отображаете сцену в правильном порядке (в вашем ответе отсутствует рендеринг).

Убедитесь, что вы используете нужную функцию наложения.

Еще одно предложение, которое я могу сделать, - это начать использовать шейдеры .Я всегда чувствую себя немного лучше, когда использую их.

0 голосов
/ 02 января 2012

Я получаю те же результаты (работает на Android Samsung Galaxy S, для чего это стоит). Я не понимаю, почему это не работает. Документы кажутся достаточно ясными.

Для меня это работает, если я использую GL_MODULATE для RGB. Сбой снова, если я использую GL_ADD или GL_ADD_SIGNED. Даже использование GL_MODULATE для альфы дает такое же ошибочное поведение при использовании этих режимов в RGB. Возможно, вы застряли с модуляцией своих цветов вместо интерполяции.

В итоге, это работает для меня:

glActiveTexture (GL_TEXTURE0); // do we need stage #1?
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
0 голосов
/ 29 декабря 2011

Вы пробовали приведенный выше код с glEnable (GL_BLEND)?

...