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

问题描述:

我使用开罗/ Pango为使用OpenGL的文本显示生成位图。我生成的位图为RGBA,背景为透明,文字为黑色或白色。 (让我们假设黑色)OpenGL - 纹理 - 用颜色代替黑色(白色)

如果我将这个位图作为OpenGL纹理加载并显示出来,它就像预期的那样显示为黑色文本或白色文本。

我希望能够仅使用原始纹理对文本着色,但使用OpenGL照顾着色。

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

但是,我不能得到任何这些选项的工作。

我有什么尝试看起来像是 无数组合 - 白色文本或黑色文本 - 使混合或使用GL_TEXTURE_ENV_MODE的GL_BLEND - 试图GL_MODULATE,GL_REPLACE和GL_COMBINE - 尝试各种不同的充glBlendFunc组合

我我一直在网上搜索和阅读规范几个小时,我真的在我的绳索结束。

任何人都可以将我指向正确的位置以获得答案吗?

去最简单的方法是让你的文字位图白色文字和透明背景。

然后,去色,你必须确保TEXTURE_ENV_MODE设置为调节:

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); 
+0

这个答案有很大帮助。它帮助我找到最大的问题,这几乎是我是个白痴......通常当我使用glColor时,我会做一些类似glColor(1.,0,0,0,0)的不透明红色。这就是我之前所做的......但最终的0.将整个纹理上的alpha设置为0.(因为它正在倍增)。我确实需要使用glColor(1.,0,0,0,1 ),以便纹理中的任何alpha都能生效。哇,我觉得愚蠢。 – 2011-04-23 15:02:48

这听起来像你可以创建位图,只要你认为合适。如果是这样的话,我会把文字绘制到alpha通道上,而不是白底黑字。然后为文本着色,绘制所需颜色的矩形(或其他)。然后在上面画上你的纹理。纹理不透明的地方,你会得到纹理颜色。纹理透明的地方,背景颜色会显示出来。

要做到这一点,您必须设置glBlendFunc。通常应罚款:

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

您还可以开启混合的纹理:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); 

代替供给充分RGBA组,让文本只是determinine非/透明度,即只是提供一个alpha通道。然后使用正常的glColor设置文本颜色。

+0

以及如何做到这一点?这正是我要搜索的内容 – 2016-10-09 10:06:29

+0

@ProkopHapala:将字形栅格化为灰度格式并将其上传到GL_ALPHA格式纹理(固定函数OpenGL)或GL_RED格式纹理,并在片段着色器中将纹理的R分量分配给输出片段的A组件。 – datenwolf 2016-10-09 12:19:35

+0

aha,好吧,使用fragmet着色器它可能很容易(虽然我没有测试过),但我现在正在尝试做现在的老式GL 2016-10-09 12:26:31