我的应用程序使用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());
现在我遇到了一个主要问题:我在程序中很早就创建了一个字符串,它可以正确呈现。然后是另一个后来创建的字符串,它只渲染那些也包含在第一个字符串中的字母。我只能假设纹理字体只为第一个字符串的字母创建纹理,而不是第二个字符串的字母。
原因可能是什么?我是否需要加载我将尽早使用的所有字符?有什么我想念的吗?
(将我的代码简化为一个重现错误的最小例子会有一些努力,所以我先问一些明显我做错的事。)
答案 0 :(得分:0)
我找到了原因:我在代码中的其他地方调用了Impl::font->BBox(my_string.c_str())
。显然,这会导致将字符串渲染为纹理并缓存它。现在因为这个代码是从另一个线程调用的,所以它无法加载缺少的字符。一旦我将BBox
计算移动到渲染线程,一切都运行正常。