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

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

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

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

Загружать и связывать текстуру шрифта растрового изображения Разбирать текст и генерировать и связывать массив вершин, отображать текстуру с помощью массива uv,... Render it для экрана

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

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

Ответ 1

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

Этот шаг отдыха займет некоторое время, но, конечно, не слишком много.

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

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

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

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

Один хороший современный источник вдохновения может быть код Nicole Rougier freetype-gl.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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