如前所述,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);