Ваше описание использования freetype для создания атласа текстуры вместе со всей информацией о глифе - это именно то, что я делаю в моем текущем проекте iPhone.
Я делаю весь анализ шрифта на этапе предварительной обработки (все в C # в Windows, как это происходит). Сам атлас генерируется и содержит только необходимые символы - чтобы сократить пространство, я также иногда заканчиваю тем, что генерирую больше чем один атлас, чтобы сохранить размеры текстур pow2 и разумного разрешения.
Вы можете легко извлечь информацию о глифе из freetype. Передайте это в ваше приложение вместе с текстурами во время выполнения, и тогда будет достаточно просто изменить UV-координаты текстуры по мере необходимости.
Для чего это стоит, вот как я определяю символ глифа внутри моего маленького движка:
struct FontGlyph
{
u32 char_code;
u32 m_x; // base x position on tpage
u32 m_y; // base y position on tpage
u32 m_width; // glyph width
u32 m_height; // glyph height
i32 m_horiBearingX; // Distance to X shift
i32 m_horiBearingY; // Distance to Y shift
u32 m_horiAdvance; // Total Horizontal advance this character requires
u32 m__tpage_index; // Which tpage does this glyph use?
};
Затем у меня есть объект SpriteString, который ведет себя почти как любая другая строка, за исключением того, что я могу нарисовать его с помощью спрайтов ....
Я согласен, что все это может показаться большой работой для довольно тривиальной проблемы, но я обнаружил, что это дало мне достаточно гибкости и действительно не заняло так много времени для реализации, когда я приступил к ней.
Не стесняйтесь отвечать или комментировать, если вам нужны какие-либо другие детали. (И удачи:)
Ответьте на ваш комментарий, когда мне не хватило места в разделе комментариев ...
Посмотрите документацию по freetype, она дает вам данные о глифе, не беспокоясь о них, просто вытаскивает их прямо из шрифта. Что касается самих текстур, вы получаете свободный тип для рендеринга каждого глифа, а затем управляете этим для построения текстуры. Это я делаю как предварительный процесс, полностью отделенный от моего основного приложения.
Вот отрывок моего кода инструмента, который делает это: http://pastebin.com/md1c6354
Обратите внимание, хотя, это когда-либо было предназначено только для моих глаз, а не для общественного потребления, так что извините за то, что это чертовски грязно:)