4

我在 FTGL 中使用纹理字体将字体渲染到多个画布中,作为轴等的标签。我的第一个情节很好。然而,所有后续的画布都将我的纹理字体呈现为简单的黑色方块。我还注意到某些数字不会显示在实际渲染的画布上。“中心时间”应显示 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_TEXTURE_2D); glDisable(GL_DEPTH_TEST); 但这似乎没有帮助。出于某种原因,如果我将 FTTextureFont::FaceSize(int) 添加到我的一个返回文本宽度的例程中,一切都会正确显示(尽管速度很慢)。从 FTGL 源代码来看,除了 glDeleteTexture() 调用之外,FaceSize() 似乎不会操纵 openGL 参数,所以我有点困惑为什么会这样。

4

4 回答 4

1

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

glEnable(GL_BLEND);
于 2013-01-05T11:53:46.940 回答
0

它可能在以下情况下发生:

  1. opengl 渲染的线程和 ftgl::Render 的线程不一样。
  2. 进入全屏模式(需要重置并重新加载所有纹理)。
  3. 不正确的 Z 位置(顺序)。首先渲染字体然后图像或第一个图像然后字体。
  4. glDeleteTexture() 可以做到。
于 2013-03-10T13:22:11.277 回答
0

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

_font->FaceSize(fontsize);

更新要渲染的文本时。

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

于 2015-10-28T09:59:21.093 回答
0

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

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

于 2016-10-14T19:04:33.390 回答