Como se mencionó, glTexEnv es el camino a seguir.
Para sustituir los componentes RGB de su textura y mantener intacta su alfa, podría intentar algo como esto (el código utiliza el rojo como color de sustitución):
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
Aquí vienen algunas explicaciones.
Al usar GL_COMBINE, tiene control completo sobre cómo la entrada/salida de las diferentes etapas de textura se combinan juntas. En este caso, especificamos que queremos reemplazar (GL_REPLACE) los componentes RGB de la etapa de textura 0 con lo que viene de la etapa anterior (GL_PREVIOUS) que en este caso es un color único (establecido con glColor4f).
No establecimos nada especial para el componente alfa ya que queremos el comportamiento normal. Añadiendo las siguientes líneas habría tenido el mismo efecto que si no está incluido (comportamiento predeterminado):
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);
Me gustaría que fuera relacionado pitón, que tendría unos tropecientos respuestas a estas alturas. – sharvey