在检查了 FTGL 的代码后,很明显该 API 是为自己进行文本呈现而设计的。您应该调用它的渲染函数,这将在内部进行 OpenGL 调用。
换句话说,FTGL 的设计目的不是将字体加载到纹理中,然后给您该纹理对象并让您自己绘制字形。这并不意味着您不能,因为 API 不会帮助您做到这一点。
你变黑的原因是因为GL_ALPHA
纹理在访问时为 RGB 组件返回零。由于您GL_MODULATE
在纹理环境中使用,因此将颜色的 RGB 部分乘以零。
要做你想做的事,你需要设置GL_TEXTURE_ENV_MODE
toGL_COMBINE
而不是GL_MODULATE
. 这意味着您需要使用combine 环境模式,这并不简单。几乎一出现着色器就放弃了着色器的固定功能,我已经很长时间没有接触过组合器了。因此,请采取一粒盐。下面是对环境代码应该是什么样子的猜测:
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_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
您要做的是生成一种颜色,其中 RGB 部分来自glColor
纹理,Alpha 部分来自纹理。这就是你这样做的方式。
在英文中,第一行说纹理环境模式是“combine”,它激活了一个更复杂的操作模式。接下来的三行指定如何生成颜色的 RGB 部分。GL_COMBINE_RGB
设置为GL_REPLACE
意味着源 RGB 值 0 将是输出 RGB 的值。设置GL_SRC0_RGB
为GL_PRIMARY_COLOR
意味着源 RGB 值 0 是原色,它是由顶点处理生成的颜色(即:除非您使用照明,否则这就是您传递的颜色glColor
)。设置GL_OPERAND0_RGB
为GL_SRC_COLOR
意味着按原样获取颜色(您可以执行一些特殊操作,例如 take1 - the color
或其他)。
接下来的 3 行设置了输出颜色的 alpha 部分的来源。GL_COMBINE_ALPHA
设置为GL_REPLACE
意味着源alpha值 0(与源RGB值 0 不同)将是输出 alpha 的值。设置GL_SRC0_ALPHA
为GL_TEXTURE
表示源 alpha 值 0 来自当前纹理单元的纹理。设置GL_OPERAND0_ALPHA
为GL_SRC_ALPHA
意味着按原样获取 alpha(和以前一样,您可以在此处对 alpha 应用一些变换)。
或者,如果您的 OpenGL 实现有可用的ARB_texture_swizzle,您可以设置一个 swizzle 掩码以有效地将GL_ALPHA
格式转换为GL_INTENSITY
. 然后你可以GL_MODULATE
用作你的GL_TEXTURE_ENV_MODE
. 但是,您必须确保您的混合模式是glBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
. 这是必要GL_MODULATE
的,因为会将颜色乘以 alpha。如果您使用GL_SRC_ALPHA
而不是GL_ONE
,您将执行乘以 alpha两次(一次在纹理环境阶段,一次在混合阶段)。