OpenGL - 纹理 - 用颜色替换黑色(白色)

时间:2011-04-23 06:22:37

标签: opengl

我正在使用Cairo / Pango生成OpenGL文本显示的位图。我将位图生成为具有透明背景的RGBA,并且文本为黑色或白色。 (我们假设是黑色。)

如果我将此位图加载为OpenGL纹理并显示它,它会显示为黑色文本或白色文本,如预期的那样。

我希望能够仅使用原始纹理为文本着色,但使用OpenGL处理​​着色。

最好,我想使用glColor设置颜色,但我愿意使用glBlendColor或GL_TEXTURE_ENV_COLOR。

但是,我无法使用任何这些选项。

我尝试了无数的组合   - 白色文字或黑色文字   - 启用混合或使用GL_TEXTURE_ENV_MODE的GL_BLEND   - 尝试GL_MODULATE,GL_REPLACE和GL_COMBINE   - 尝试各种不同的glBlendFunc组合

我一直在网上搜索并阅读规格几个小时,我真的在我的绳子尽头。

有人能指出我找到合适的答案吗?

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用白色文本和透明背景显示文本位图。

然后,要为其着色,您必须确保将TEXTURE_ENV_MODE设置为MODULATE:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

这样,绘制颜色将是 glColor * textureColor == glColor (因为textureColor为白色)

然后你必须启用混合来处理透明背景:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

,如果您的位图是预乘alpha形式:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

答案 1 :(得分:1)

不要提供完整的RGBA集,而是让文本只确定非/透明度,即只提供一个alpha通道。然后使用普通glColor设置文本颜色。

答案 2 :(得分:0)

听起来你可以根据需要创建位图。如果是这种情况,我会将文本绘制到alpha通道,而不是黑白。然后为文本着色,绘制所需颜色的矩形(或其他)。然后在上面绘制纹理。纹理不透明的地方,你会得到纹理颜色。纹理透明的地方,背景颜色将显示。

为此,您必须设置glBlendFunc。通常应该没问题:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

您还必须打开混合纹理:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);