Come menzionato, glTexEnv è la strada da percorrere.
per sostituire i componenti RGB vostra struttura e mantenere la sua alfa incontaminata, si potrebbe provare qualcosa di simile (questo codice utilizza il rosso come colore di sostituzione):
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
Arrivano alcune spiegazioni.
Quando si utilizza GL_COMBINE, si ha il controllo completo su come l'input/output delle diverse fasi di trama viene combinato insieme. In questo caso, specifichiamo che vogliamo sostituire (GL_REPLACE) le componenti RGB dello stage di texture 0 con quello che proviene dallo stage precedente (GL_PREVIOUS) che in questo caso è un singolo colore (impostato con glColor4f).
Non abbiamo impostato nulla di speciale per il componente alfa perché vogliamo il comportamento normale. aggiungendo le seguenti righe avrebbe avuto lo stesso effetto se non incluso (comportamento di default):
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);
Vorrei che fosse correlato pitone, avrei un trilione di risposte ormai. – sharvey