我正在尝试使用 FTGL 字体库来创建纹理映射字体并将其渲染到屏幕上。该库以 GL_ALPHA
格式创建一个纹理来保存字体字形,然后当您告诉它渲染一个字符串时,它会通过 glBegin(GL_QUADS)
并渲染每个字形,这正是您所期望的。
唯一的问题是,我没有收到任何文本。在一种情况下,我得到实心黑框而不是文本,在另一种情况下我什么也得不到。我已经在 gDEBugger 下运行代码以确保纹理被正确上传和设置,一切看起来都正确,但我仍然没有看到任何输出。
我已经尝试了显而易见的东西。预先调用 glColor
尝试设置文本颜色没有任何作用。也不会试图确保 alpha 混合正常工作,如下所示:
glEnable(GL_ALPHA_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
有没有人知道我缺少什么,以便使从
GL_ALPHA
纹理到屏幕的渲染正确显示? 最佳答案
在检查 FTGL 的代码后很明显,API 旨在自己进行文本呈现。您应该调用它的渲染函数,这将在内部进行 OpenGL 调用。
换句话说,FTGL 并不是为了将字体加载到纹理中,然后为您提供该纹理对象并让您自己绘制字形。这并不意味着您不能,因为 API 不会帮助您做到这一点。
你变黑的原因是因为 GL_ALPHA
纹理在访问时为 RGB 组件返回零。由于您在纹理环境中使用了 GL_MODULATE
,这会将零乘以颜色的 RGB 部分。
要按照您的意图进行操作,您需要将 GL_TEXTURE_ENV_MODE
设置为 GL_COMBINE
而不是 GL_MODULATE
。这意味着您需要使用 combine environment mode ,这并不简单。着色器的固定功能几乎一出现就放弃了,我已经很长时间没有接触过组合器了。因此,请保留以下内容。以下是对环境代码应该是什么样子的猜测:
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
意味着按原样获取颜色(您可以执行一些特殊操作,例如获取 1 - 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 两次(一次在纹理环境阶段,一次在混合阶段)。