2011-12-19 4 views
5

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

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

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

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

+0

Ваш код кажется правильным для меня. Не могли бы вы приложить скриншот альфа-проблемы или описать, что с ним плохо. – iHunter

+0

Не могли бы вы загрузить текстуру? –

+0

Также, рендеринг кода? –

ответ

0

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

+0

Он всегда включен. – brigadir

0

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

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

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

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

0

Я получаю те же результаты (работает на 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

Да, с модульным режимом все работает правильно, но похоже, что я не хочу. Я поставлю +50 здесь, чтобы не потерять его. – brigadir

+0

Спасибо за щедрость. Извините, я не мог больше помочь. –

 Смежные вопросы

  • Нет связанных вопросов^_^