我正在使用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组合
我一直在网上搜索并阅读规格几个小时,我真的在我的绳子尽头。
有人能指出我找到合适的答案吗?
答案 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);