Мое приложение выполняет вывод текста с помощью 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());
Теперь у меня есть серьезная проблема: есть одна строка, которую я создаю довольно рано в программе, которая правильно отображает. Затем есть другая строка, которая создается позже, и она отображает только те буквы, которые также содержатся в первой строке. Я могу только предположить, что текстурный шрифт создает только текстуры для букв первой строки, но не для текстур второй строки.
Что может быть причиной этого? Нужно ли загружать все символы, которые я буду использовать раньше? Я что-то упускаю?
(Было бы достаточно усилий, чтобы свести мой код к минимальному примеру, который воспроизводит ошибку, поэтому я сначала спрашиваю о чем-то очевидном, что я делаю неправильно.)
Я нашел причину: я позвонил Impl::font->BBox(my_string.c_str())
где-то еще в коде. По-видимому, это приводит к отображению строки в качестве текстуры и ее кешированию. Теперь, поскольку этот код был вызван из другого потока, он не мог загрузить отсутствующие символы. Как только я переехал BBox
Расчет до рендеринга потока, все работало просто отлично.
Других решений пока нет …