使用多个画布时,FTGL纹理字体仅显示黑框

时间:2013-01-03 02:33:37

标签: c++ opengl ftgl

我在FTGL中使用纹理字体将字体渲染成多个画布作为轴等的标签。我的第一个情节很好。然而,所有后续的画布都将我的纹理字体渲染为简单的黑色方块。我还注意到一些数字不会显示在画布上实际渲染。 “中心时间”应显示8.3956,但显示以下内容。

enter image description here

字体渲染如下:

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    PushGLMatrices();
            GrSetPixelProjection();
            glTranslatef(pixelX, pixelY, 0.0);
            glRotatef(ang, 0.0, 0.0, 1.0);
            savedFont->Render(label);
    PopGLMatrices();

其中

    void PushGLMatrices()
    {
            glMatrixMode(GL_PROJECTION);
            glPushMatrix();
            glMatrixMode(GL_MODELVIEW);
            glPushMatrix();
    }

void PopGLMatrices()
{
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
}

我尝试了一些事情,比如清除颜色和深度位,以及glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST);但这似乎没有帮助。出于某种原因,如果我将FTTextureFont :: FaceSize(int)添加到我的一个返回文本宽度的例程中,所有内容都会正确显示(尽管速度很慢)。从查看FTGL源代码看,除了glDeleteTexture()调用之外,FaceSize()似乎不会操纵openGL参数,所以我有点困惑为什么这样做。

4 个答案:

答案 0 :(得分:1)

当您绘制后续图时,似乎禁用了Alpha混合。在渲染文本之前,请确保已启用它:

glEnable(GL_BLEND);

答案 1 :(得分:0)

可能发生在:

  1. opengl渲染线程和ftgl :: Render的线程不相同。
  2. 以全屏模式进入(需要重置并重新加载所有纹理)。
  3. 不正确Z possition(订单)。首先渲染字体然后是图像或第一个图像然后是字体。
  4. glDeleteTexture()可以做到。

答案 2 :(得分:0)

我有一个类似的问题,我解决了它添加了这个:

_font->FaceSize(fontsize);
更新要渲染的文本时

此函数调用删除旧纹理新文本将显示正常

答案 3 :(得分:0)

IIRC,OpenGL纹理在上下文中创建,每个窗口都有一个单独的上下文。由于FTGL不使用共享上下文的概念(我在某处读到了有一种方法),最简单的方法是为每个窗口实例化一个新的FTTextureFont - 并在设置每个窗口后加载每个FaceSize(通过调用例如,Freeglut上的glutSetWindow(id)。这将立即加载所有窗口/上下文的纹理。

FTTextureFont的唯一问题是,每次更改FaceSize时,它都会使用FreeType重新加载所有字形并再次生成纹理。这非常慢。有人应该在某个时候解决这个问题。我通过在我的应用程序中创建一个我需要使用的FTTextureFont PER窗口PER大小来解决这个问题。