Как уже упоминалось, glTexEnv - это путь.
Чтобы заменить RGB-компоненты вашей текстуры и оставить ее нетронутой альфа, вы можете попробовать что-то вроде этого (этот код использует красный в качестве цвета замены):
glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
glActiveTexture( GL_TEXTURE_0 );
glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
// ... draw as usual
Вот некоторые объяснения.
При использовании GL_COMBINE вы полностью контролируете, как ввод / вывод различных этапов текстуры объединяются вместе. В этом случае мы указываем, что мы хотим заменить (GL_REPLACE) компоненты RGB этапа текстуры 0 на то, что происходит на предыдущем этапе (GL_PREVIOUS), который в этом случае является одним цветом (устанавливается с помощью glColor4f).
Мы не установили ничего особенного для альфа-компонента, так как хотим нормального поведения.
Добавление следующих строк имело бы такой же эффект, как если бы оно не было включено (поведение по умолчанию):
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);