0

我的应用程序使用 OpenGL 和 FTGL 进行一些文本输出。我设置了这样的字体:

Impl::font = new FTTextureFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf");
if (Impl::font->Error() != 0) {
    delete Impl::font;
    throw std::runtime_error("Could not load font DejaVuSans.ttf!");
}
if (!Impl::font->FaceSize(72)) {
    delete Impl::font;
    throw std::runtime_error("Could not use DejaVuSans with size 72!");
}

我这样渲染:

glColor3f(1.0, 1.0, 1.0);
Impl::font->Render(my_string.c_str());

现在我有一个主要问题:我在程序的早期创建了一个字符串,它可以正确呈现。然后是稍后创建的另一个字符串,它只呈现也包含在第一个字符串中的那些字母。我只能假设纹理字体只为第一个字符串的字母创建纹理,而不为第二个字符串的字母创建纹理。

这可能是什么原因?我是否需要让它加载我将尽早使用的所有字符?有什么我想念的吗?

(将我的代码简化为重现错误的最小示例将是相当大的努力,所以我首先要求一些明显我做错的事情。)

4

1 回答 1

0

我找到了原因:我Impl::font->BBox(my_string.c_str())在代码中的其他地方调用了。显然,这会导致将字符串渲染为纹理并将其缓存。现在因为这段代码是从另一个线程调用的,所以它无法加载丢失的字符。一旦我将BBox计算移至渲染线程,一切都运行良好。

于 2013-09-20T11:56:14.173 回答