Правильный способ рисования текста в OpenGL ES 2

Я использую PowerVR OpenGL ES 2 SDK для разработки своей игры в Windows с помощью C ++, после чего могу перенести ее на android или iphone.

Все выглядит нормально, но теперь я застрял на рендеринге текста. Я не нашел подробного руководства по рендерингу текста (с использованием шрифта TTF или Bitmap) в OpenGL ES 2.0 с использованием C ++. Я нашел много разговоров о рендеринге текста на android или iphone с использованием java или objective-c (с textview, surfaceview или другими вещами бла-бла), но я не думаю, что это то, что мне нужно. Мне нужно «кроссплатформенное решение». (а может я здесь ошибаюсь?)

После небольшого исследования у меня в голове есть решение:

Загрузка и привязка текстуры растрового шрифта -> Анализ текста, создание и привязка массива вершин, сопоставление текстуры с uv-массивом, ... -> Визуализация на экран < / сильный>

Я еще не тестировал, но думаю, что это проблема при использовании моего решения: когда я хочу изменить текст (например, я делаю оценку пользователя или таймер на экране), я должен повторно привязать массив вершин и uv массив, это не очень хорошая идея, правда?

Есть ли лучший способ / правильный способ рисования растрового шрифта на экране с помощью OpenGL ES 2?


person Huy Tran    schedule 01.08.2012    source источник


Ответы (3)


Решение, о котором вы упомянули, является правильным, и действительно, если вы измените свой текст, вам придется воссоздать геометрию, которая его представляет, и повторно отправить ее в OpenGL.

Этот этап восстановления займет некоторое время, но не слишком много.

Для визуализации текста проблема состоит из двух основных компонентов:

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

Чтобы создать атлас текстуры, вы можете найти какой-нибудь код (возможно, используя freetype) или использовать существующий инструмент (например, Bmfont от AngleCode).

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

Одним из хороших современных источников вдохновения может быть код freetype-gl Николя Ружье.

person rotoglup    schedule 03.08.2012
comment
Есть ли у кого-нибудь пример Android OpenGL ES 2.0, который поддерживает вращение? - person Burf2000; 18.09.2014

рендеринг текста - одна из тем, с которой рано или поздно придется столкнуться новичкам в мире 3D-библиотек.

В Интернете есть много руководств по рендерингу текста, многие книги говорят об этом. Мой совет - посмотреть вокруг и попытаться понять, как они работают.

Шрифты TTF не являются жизнеспособным решением, поскольку в сценарии вычислений в реальном времени (например, в компьютерной игре) метод TTF на основе геометрии требует слишком много ресурсов.

Очень распространенное решение (которое я использую, например, в моем 3D-движке PATRIA) - использовать атлас текстур, содержащий глиф различных символов, тогда логика вашего приложения должна обрабатывать отношение текста -> позиции глифа для текстурирования квадраты, которые составят ваш окончательный "экранный текст".

Рендеринг текста - это непростая тема, поскольку она включает такие темы, как кернинг / интервал / другой размер текста и т. Д.

Попробуйте перейти по этой ссылке, чтобы лучше понять тему (если я не ошибаюсь, автор этой вики является активным членом этого самого сообщества).

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_OpenGL_Tutorial_Modern_OpenGL_Tutorial_OpenGL_Tutorial

person Maurizio Benedetti    schedule 03.08.2012

Правильный способ рисования текста в игре - использовать атласы текстур с глифами, содержащими поля расстояний: https://www.mapbox.com/blog/text-signed-distance-fields/

Также см. Этот документ Siggraph от Valve (создателей Half-Life и Portal), описывающий варианты этой техники: http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Качество текста на основе поля расстояния намного выше, чем у простого текста на основе растрового изображения. Он также использует меньше памяти, потому что поле расстояния меньше, чем дословное растровое представление шрифта.

person kaalus    schedule 07.12.2015