Есть много вопросов по рендерингу шрифтов OpenGL, многие из них удовлетворяются атласами текстур (быстрыми, но неправильными) или строковыми текстурами (только для фиксированного текста).
Однако эти подходы плохи и кажутся устаревшими (что делать с шейдерами, чтобы сделать это лучше/быстрее?). Для OpenGL 4.1 есть отличный вопрос, "что вы должны использовать сегодня?":
Что представляет собой современное состояние для текстового рендеринга в OpenGL с версии 4.1?
Итак, что мы должны использовать на iOS GL ES 2 сегодня?
Я разочарован тем, что, похоже, нет открытого (или даже коммерческого) решения. Я знаю, что многие команды высасывают его и тратят несколько недель на время восстановления своего колеса, постепенно учась тому, как ядро и пространство и т.д. (Тьфу) - но должен быть лучший способ, чем переписывать все "шрифты", с нуля?
Насколько я вижу, есть две части:
- Как визуализировать текст с помощью шрифта?
- Как отобразить вывод?
Для 1 (как для рендеринга) Apple предоставляет МНОГИЕ способы получения "правильного" визуализированного вывода, но "простые" не поддерживают OpenGL (возможно, некоторые из них - например, есть простой способ отобразить вывод CoreText в OpenGL?).
Для 2 (как отображать) у нас есть шейдеры, у нас есть VBOs, у нас есть глиф-текстуры, у нас есть текстуры lookup и другие теки (например, связанные с OpenGL 4.1 вещи, которые были связаны выше?)
Вот два общих подхода OpenGL, о которых я знаю:
- Атлас текстуры (визуализируйте все глифы один раз, затем визуализируйте 1 x текстурированный квадратик на символ, из общей текстуры)
- Это неправильно, если вы не используете эпоху растрового изображения 1980-х годов (и даже тогда: текстурный атлас требует больше работы, чем может показаться, если вам нужно это правильно для нетривиальных шрифтов)
- (шрифты не являются "коллекцией глифов", там огромное количество позиционирования, макета, обертывания, интервала, кернинга, стилизации, раскраски, взвешивания и т.д. Текстуры текстуры терпят неудачу)
- Фиксированная строка (используйте любой класс Apple для правильной рендеринга, затем снимите снимки с фоновыми изображениями и загрузите их как текстуру)
- В человеческих терминах это быстро. При рендеринге кадра это очень, очень медленно. Если вы делаете это с большим количеством изменяемого текста, частота кадров проходит через пол.
- Технически, это в основном правильное (не полностью: вы теряете некоторую информацию таким образом), но чрезвычайно неэффективны
Я тоже видел, но слышал и хорошие, и плохие вещи о:
- Воображение /PowerVR "Print3D" (ссылка сломана) (от парней, которые производят GPU! Но их сайт переместил/удалил страницу отображения текста).
- FreeType (требуется предварительная обработка, интерпретация, много кода, дополнительные библиотеки?)
- ... и/или FTGL http://sourceforge.net/projects/ftgl/ (слухи: медленный? buggy? не обновляется в течение длительного времени?)
- Font-Stash http://digestingduck.blogspot.co.uk/2009/08/font-stash.html (высокое качество, но очень медленно?) 1.
В собственных ОС/стандартных библиотеках Apple я знаю несколько источников текстового рендеринга. NB: я использовал большинство из них подробно для проектов 2D-рендеринга, мои заявления о них, выводящие разные рендеринг, основаны на непосредственном опыте
- CoreGraphics с NSString
- Самый простой из всех: сделать "в CGRect"
- Похоже, что это немного более быстрая версия "фиксированной строки", которую люди рекомендуют (хотя вы ожидаете, что она будет почти такой же)
- UILabel и UITextArea с открытым текстом
- NB: они не то же самое! Небольшие различия в том, как они отображают текст smae.
- NSAttributedString, отображаемый в одном из указанных выше
- Снова: проявляется по-разному (различия, которые я знаю, довольно тонкие и классифицируются как "ошибки", различные SO-вопросы об этом)
- CATextLayer
- Гибрид между шрифтами iOS и старым C-рендерингом. Использует "не полностью" бесплатный CFFont/UIFont, который показывает еще несколько различий/странностей рендеринга
- CoreText
- ... окончательное решение? Но это зверь...