正如所提到的,glTexEnv是要走的路。
要更換你的紋理的RGB分量,並保持其Alpha不變,你可以嘗試這樣的事情(這代碼使用紅色作爲替代色):
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_PREVIOUS)替換(GL_REPLACE)紋理階段0的RGB分量,在這種情況下,它是單一顏色(使用glColor4f設置)。
我們沒有爲alpha組件設置任何特殊的東西,因爲我們需要常規行爲。 添加以下行將不得不彷彿不包括(默認行爲)相同的效果:
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);
我想這是蟒蛇的關係,我現在有一個極大的答案。 – sharvey 2010-11-14 22:59:00