Методы рендеринга текста OpenGL и компромиссы

Фон

Я работаю над игрой Bitfighter. Мы по-прежнему совместимы с OpenGL 1.1 и компилируем для OSX, Windows и Linux.

Мы используем векторную графику для всего, включая рендеринг текста и манипуляции. Мы используем слегка измененную вариацию "FontStrokeRoman" от GLUT, которая представляет собой всего лишь пучок статических линий. Нам это нравится, поскольку он, кажется, работает очень хорошо, легко вращается/масштабируется/управляется. Мы также разрешаем в игре чат, чтобы текст рисовался "на лету".

Проблема

Мы хотим использовать больше/разных шрифтов.

Мы нашли несколько других шрифтов, которые нам нравятся, но все они являются шрифтами TTF-типа, которые построены как полигоны (с кривыми и т.д.) вместо штрихов или шипов. Это вызывает несколько проблем:

  • Нам нужно будет использовать текстуры (которых мы до сих пор избегали в игре)
  • Они не легко изменяются/вращаются/и т.д.
  • Производительность значительно меньше (теоретически?)

Мы экспериментировали с преобразованием шрифтов TTF в массивы точечных полигонов, а затем с триангуляцией заливки. Это, однако, было трудно сделать красиво - пиксельный намек/сглаживание кажется трудным сделать в этом случае.

Мы даже экспериментировали с скелетонированием полигональных шрифтов с использованием библиотек типа "campskeleton", поэтому мы можем выводить шрифт векторного штриха (с небольшим успехом, который выглядит хорошо).

Что нам делать?

Я знаю, что этот вопрос несколько общий. Мы хотим сохранить производительность и возможности манипулирования текстами, но можем использовать лучшие шрифты. Я открыт для любого предложения в любом направлении.

Некоторые решения могут быть ответом на следующее:

  • Как мы правильно сглаживаем текст на основе полигона и сохраняем производительность?
  • Действительно ли текстуры работают хуже, чем статические массивы точек? Возможно, у меня есть ошибочное предположение.
  • Можно ли быстро или быстро изменять размер шрифта?
  • Что-то совсем другое?

Ответ 1

После некоторого убеждения (спасибо Сержу) и опробования нескольких предложений здесь (включая FTGL, использующий freetype), мы остановились на:

Font-Stash, который использует stb_truetype

Это казалось идеальным для нашей игры. Производительность рендеринга была сравнима с используемым нами векторным шрифтом-обводкой - текстурированные квадраты действительно не такие медленные, после генерации, и кеширование из Font-Stash очень помогает. Кроме того, использование stb_truetype позволило нам не требовать другой зависимости в игре на всех платформах.

Что бы ни стоило, это решение было примерно на порядок быстрее, чем использование FTGL для шрифтов истинного типа, возможно, из-за кэширования.

Спасибо за предложения и указатели.

Обновить

Ссылка Font-Stash выше была ответвлением оригинала здесь. С тех пор оригинал был обновлен, добавил некоторые функции, которые есть в форке, и может разрешать различные рендеринг-серверы.

Ответ 2

Я не эксперт OpenGL или графический эксперт в целом. И, действительно, Raptor, я -hate - быть парнем, который говорит это, потому что я знаю, как вы себя чувствуете прямо сейчас.

Мне очень жаль это говорить, но, честно говоря, я просто дам шрифты TTF, используя их текстуры и полигоны, как они были предназначены. Я сомневаюсь, что такое использование действительно будет пагубным для вашей работы в наши дни. Вероятнее всего, было бы более полезно сэкономить время, чтобы использовать их как есть, а не тратить время на эксперименты вокруг какого-нибудь умного решения, которое больше соответствует вашим желаниям.

Я сомневаюсь, что рисование текста с использованием полигонов/текстур было бы пагубным для вас. Это особенно актуально сегодня для компьютеров. Сколько лет назад, технологически, вы намерены поддерживать свою заявку? Или, может быть, вы хотите запустить его на малиновый PI? Или другие мобильные платформы, которые не имеют высоких графических возможностей? Поддержка любого из них может, возможно, аннулировать мои претензии.

Но, как я уже сказал, я действительно ненавижу быть тем парнем, который предлагает вам двигаться вперед, как есть. Потому что я был там, прося совета по работе (иногда даже по более тонким вещам) и просто стонал, когда кто-то сказал: "Забудь об этом, компилятор справится с этим" или "компьютеры настолько продвинуты, что не стоит беспокоиться об этом", Я искренне надеюсь, что кто-то еще приходит с опытом, и хороший ответ для вас. Однако, если нет, я просто хочу сообщить вам: я не могу предвидеть, что использование TTF, как и предполагалось, будет пагубным для производительности вашего геймплея.

Ответ 3

Вы пытались описать разложение глифов с помощью freetype FT_Outline_Decompose? Freetype - это инструмент выбора для рендеринга шрифтов и извлечения глифов. Подсказка поддерживается, и режимы рендеринга позволяют указать, что вы хотите сглаживать, намекать, монохромные цели и т.д.

Freetype также имеет встроенный механизм кэширования глифов/битмапов, который может быть полезен.

Примечание: OGFLT, похоже, перекрывает разрыв между freetype и opengl, хотя у меня никогда не было возможности использовать его