如何渲染GL_ALPHA纹理?

时间:2011-12-15 23:00:31

标签: opengl ftgl

我正在尝试使用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纹理渲染到屏幕正确显示?

1 个答案:

答案 0 :(得分:3)

在对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部分来自纹理。这就是你如何做到的。

在英语中,第一行表示纹理环境模式是“组合”,它激活了一个更复杂的操作模式。接下来的三行指定如何生成颜色的RGB部分。 GL_COMBINE_RGB设置为GL_REPLACE表示源RGB值0将是输出RGB的值。将GL_SRC0_RGB设置为GL_PRIMARY_COLOR意味着源RGB值0是主要颜色,它是由顶点处理生成的颜色(即:除非您使用光照,否则这就是您通过{{{ 1}})。将glColor设置为GL_OPERAND0_RGB意味着将颜色设置为原样(您可以执行特殊操作,例如执行GL_SRC_COLOR或其他操作)。

接下来的3行设置输出颜色的alpha部分来自哪里。设置为1 - the color的{​​{1}}表示源 alpha 值0(与源 RGB 值0不同)将是输出alpha的值。将GL_COMBINE_ALPHA设置为GL_REPLACE意味着源alpha值0来自当前纹理单元的纹理。将GL_SRC0_ALPHA设置为GL_TEXTURE意味着将alpha设置为原样(如前所述,您可以在此处对alpha应用一些变换)。

或者,如果您的OpenGL实现有ARB_texture_swizzle可用,您可以设置一个混合模板以有效地将GL_OPERAND0_ALPHA格式转换为GL_SRC_ALPHA。然后,您可以使用GL_ALPHA作为GL_INTENSITY。但是,您必须确保混合模式为GL_MODULATE。这是必要的,因为GL_TEXTURE_ENV_MODE会将颜色乘以alpha。如果您使用glBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)代替GL_MODULATE,那么您将使用alpha 两次(一次在纹理env阶段,一次在混合阶段)。