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

C++ 使用多个画布时,FTGL纹理字体仅显示黑框,c++,opengl,ftgl,C++,Opengl,Ftgl,我在FTGL中使用纹理字体将字体渲染到多个画布中,作为axis等的标签。我的第一个情节很好。但是,所有后续画布都将我的纹理字体渲染为简单的黑色正方形。我还注意到一些数字并没有显示在画布上,而画布实际上是渲染的。“中心时间”应显示8.3956,但应显示以下内容 字体呈现如下所示: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); PushGLMatrices(); GrSetPixelProjection();

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

字体呈现如下所示:

    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_纹理_2D);glDisable(GLU深度测试);但这似乎没有帮助。出于某种原因,如果我将FTTextureFont::FaceSize(int)添加到一个返回文本宽度的例程中,所有内容都会正确显示(尽管速度较慢)。从FTGL源代码来看,除了glDeleteTexture()调用外,FaceSize()似乎不会操纵openGL参数,所以我有点搞不懂为什么会这样

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

glEnable(GL_BLEND);
这种情况可能发生在:

  • opengl渲染线程和ftgl::render线程不相同
  • 进入全屏模式(需要重置并重新加载所有纹理)
  • Z位置(顺序)不正确。先渲染字体,然后渲染图像,或先渲染图像,然后渲染字体
  • glDeleteTexture()可以做到这一点

  • 我有一个类似的问题,我通过添加以下内容来解决:

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


    此函数调用delete old Texture,新文本将显示良好。

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


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

    感谢您的建议,我刚刚尝试将它添加到渲染代码的开头以及初始化和绘制字体的位置,不幸的是,问题仍然存在。您开发的平台是什么?抱歉,这是一个迟到的答复,但问题仍然存在于win64和arch Linux上,这有没有解决过?我在Linux Ubuntu上看到了类似的问题,只是在启动时是随机的。要么没问题,要么有盒子。