Этот код позволяет вам отображать высокопроизводительный текст в собственном приложении OpenGL. Библиотека рендеринга шрифта была разработана с легкостью использования и оказала в виду производительность. Я писал его в 2010 году и время от времени обновлял его. Файлы шрифтов, прочитанные этой библиотекой, следуют формату, разработанному для генератора шрифтов BM: http://angelcode.com/products/bmfont/. Файл шрифта сопровождается файлом текстуры. Библиотека поддерживает стандартные текстуры RGBA, а также одноканальный SDF и даже многонаправленные SDF.

Следите за обновлениями.
Библиотека шрифтов разделена на следующие файлы:
Вызов функции шнурки выполняет следующее: Получает строку → Строка Parses → Создает список квадратов → переводит это в массив вершины буфера -> рисует все текстурированные треугольники. Во время анализа, строка для рисования проверяется на символы, которые не подлежат рисованию текущим шрифтом, эти Chars будут нарисованы в качестве вопросов. Для каждого символа в строке создается квадроцикл и добавляется в конечный квадроцикл, этот квадроцикл содержит информацию о положении и размере на экране (2D, ортогональный!) И координата текстуры для этого одного символа в растровом шрифте. Положение квадрата зависит от исходной позиции строки и положения предыдущего символа. Конкретное соотношение между расстоянием между одного персонажа и следующим называется кернином. Файл конфигурации шрифта содержит таблицу со всей информацией о кернинге для этого конкретного шрифта. Например, это может быть, что если «А» следует за «М», он должен быть на одном пикселе друг от друга, однако, когда «О» следует за «М», это минус один пиксель или нулевые пиксели. Эта информация хранится внутренне в двухмерном массиве для быстрого доступа. Чтобы сделать этот рисунок достаточно быстрым, вся информация о символах и персонажах (например, кернинг), а также текстуры загружаются при запуске программы. Тексты могут быть сохранены, так что буферы вершины не должны создаваться на каждой итерации петли рендеринга.
Самый простой способ проверить, как работает библиотека и как вы можете использовать ее в своем проекте, - это проверить пример реализации, поставляемой этим репо. В случае, если вам нужна дополнительная информация, пожалуйста, прочитайте оставшуюся часть этой главы.
Вам нужно будет скопировать 10 файлов, упомянутых в переоценке в папку проекта.
В вашем коде создайте глобальный объект библиотеки шрифтов, прежде чем открыть контекст рендеринга, например, SO:
// load openGL fonts
m_fontLibrary = new CFontLibrary(<PathToFontFolder>);
if (!m_fontLibrary-> ParseAllFontsInFolder ())
return; // no fonts found!Это загрузит все шрифты, которые хранятся в указанной вами папке в качестве входного параметра. После создания контекста рендеринга текстуры должны быть загружены, как и так:
// init font library from the current rendering context!
theApp.m_fontLibrary-> InitGLFonts ();Это может быть сделано в одноразовой функции этого контекста рендеринга, например. Имейте в виду, что вы не можете делиться текстурами между двумя или более контекстами с этой библиотекой (я не реализовал ее, потому что в то время не было эффективного способа сделать это, только некоторые карты Nvidia могли и только вроде). Таким образом, вы должны назвать это для каждого нового контекста рендеринга. Как только это будет сделано, библиотека шрифтов готова к использованию, что означает, что вы можете вызвать метод ShishString () из объекта Fontlibrary.
(ПРИМЕЧАНИЕ. В этой главе нужен капитальный ремонт, ее только примерно правильно, некоторые параметры функции отсутствуют, но в основном, в основном объясняют) заголовок считывает вызов рисования:
void DrawString ( const std::string& textToDraw, int x, int y, float color[ 4 ], const std::string& font, float scale = 1 . 0f );Параметры описаны ниже в таблице.
| Параметр | Описание |
|---|---|
| const std :: string & texttodraw | Строка, которую можно рисовать как std :: string, не распознаваемые символы рисуются как «?». Какие символы действительны зависит от используемого шрифта и могут быть определены при создании шрифта. |
| int x | X-позиция начала строки в координатах экрана. 0 - ширина |
| int y | Y-позиция начала строки в координатах экрана. 0 - высота |
| Цвет поплавки [4] | Массив плавания, содержащий информацию о цвете, которая будет использоваться для модуляции текстуры. Информация о цвете составляет значения от 0,0 до 1,0 (включительно), в следующем стандартном порядке: {r, g, b, alpha} Очевидно. |
| const std :: string & font | Этот параметр определяет тип шрифта для использования. Можно использовать только типы шрифтов, которые находятся в папке и были там во время загрузки. Вы можете передать имя файла этого шрифта, без расширения или для получения дополнительной читаемости кода и безопасности. Используйте определение из файла: fontlibrary.h. Примечание. Если вы хотите напечатать жирный жирный или курсив, вы должны использовать шрифт, который настройка для этого. |
| шкала плавания | Для текстур RGBA настоятельно рекомендуется использовать по умолчанию: 1.0F. Вы можете масштабироваться вверх или вниз, но должно быть ясно, что это приведет к размытию. Тем не менее, с SDF и MSDF вы должны иметь возможность масштабироваться вверх и вниз, прежде чем увидеть артефакты. |
Обратите внимание, что существует больше функций с дополнительными функциями, такими как автоматические разрывы линий. См. Файл заголовка библиотеки шрифтов. Также обратите внимание, что строка для рисования будет отрезана после 10922 символов. Если вам нужно больше персонажа по какой -либо нечетной причине, просто используйте дополнительные вызовы рисования и разделите строку на части.
Эта глава связана с добавлением собственных шрифтов в библиотеку шрифтов.
Обратите внимание, что я сосредотачиваюсь на не-SDF-шрифтах здесь. Шаги для шрифтов SDF довольно похожи, однако BM-Font-Gen не хватает. Вы все еще можете использовать этот инструмент, но вам нужно будет выполнить шаг после обработки с такими инструментами, как ImageMagick. Учебное пособие ниже.
Для интеграции нового шрифта необходимы только три шага: 1. Создать фон-конфиг и шрифт с использованием BM-Font-Generator 2. Скопируйте два полученных файла в папку шрифтов 3. (Необязательно) Добавить строку шрифта, как определить в Fontlibrary.h, так что вы можете использовать его более легко в своем приложении.
В следующем разделе использование генератора BM-Font подробно описано, но сначала несколько примечаний. Каждое файловое файл содержит только шрифт с фиксированным размером, а также его уже определяется файлом, будь то жирный или курсив и т. Д. То же самое для схемы, плавности шрифта и т. Д. Этот вопрос станет более ясным в следующем разделе.
Для производства шрифта, а также фактической растровой карты шрифта я использую «Генератор шрифта растрового цвета» от AngelCode. Который можно получить с их веб -сайта: http://angelcode.com/products/bmfont/ после установки, откройте программу, она должна выглядеть на следующем рисунке.

В качестве первого шага откройте установки шрифтов, нажав на параметры → настройки шрифта или нажав [F], который откроет новое окно, как показано на следующем рисунке.

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

Как основное правило, выбирайте только символы, которые вы, вероятно, будете использовать, это сохраняет время обработки и больше всего памяти, не только одного персонажа, но гораздо больше (кернинг, размер растрового изображения, размеры массива в нашем коде и т. Д.). После того, как вы выбрали все символы, ваш шрифт должен включать, перейдите к следующему разделу.
Сейчас пришло время экспортировать шрифт как растровый карту и создать файл конфигурации для него. Откройте параметры экспорта. Мои нажители [T] или нажать параметры → параметры экспорта. Новое окно должно появиться, выглядящее на следующем рисунке.

Как только эти настройки будут выполнены, закройте окно и перейдите к следующему шагу.
Чтобы убедиться, что ваша текстура не слишком большая или слишком мала, нажмите [v], находясь в главном окне или нажмите «Параметры» → Визуализируйте. Если в заголовке окна говорится что -то, кроме «Предварительного просмотра 1/1», ваша текстура слишком мала для всех ваших персонажей, и программа создаст более одного растрового карты. В этом случае откройте параметры экспорта и увеличьте размер текстуры. Примечание: это больше не должно быть в квадрате или мощности двух, это было только в версии OpenGL 1, в случае. Тем не менее, я все равно рекомендую это сделать это как таковое, так как некоторые функции, связанные с текстурой, все еще могут быть оптимизированы для этого. Fontlibrary преднамеренно не обрабатывает более одной «страницы» или текстуры, так как это означало бы, чтобы связать/подключить текстуру во время одного вызова шнурки, что является медленным! Так что сделайте это ровно на одну страницу. Если, с другой стороны, вы видите, что символы заполняют только часть растрового изображения, уменьшите размер текстуры, если это возможно, но это не так важно, как наоборот. Как только вы будете удовлетворены использованием пространства текстур, перейдите к следующему шагу.
Теперь, когда все настройки сделаны, пришло время экспортировать шрифт. Нажмите на параметры → Сохранить растровый фонт как ... Имя файла, которое вы указали здесь, повлияет на имя для шрифта в библиотеке шрифтов, поэтому выберите его с умом. По причинам удобства и читаемости, я предлагаю следующую соглашение об именах:
< курсив? > <Bold> <_ Основан? Размер?>
Вот несколько примеров:
Нажмите «Сохранить», чтобы завершить процесс. Все, что нужно сделать сейчас, это скопировать два файла для этого шрифта в папку шрифтов вашего программного обеспечения. Вы можете преобразовать TGA в PNG с помощью другого инструмента, просто не забудьте правильно изменить расширение файла в файле FNT.
Это 3 -ступенчатый процесс.
Сначала используйте генератор BMFONT, как описано выше. Однако затем используйте следующие настройки, которые могут отличаться от того, что вы использовали раньше.
Наконец, вам нужно использовать ImageMagick (https://imagemagick.org/index.php) или аналогичный инструмент для преобразования файла текстуры в SDF. После установки ImageMagick запустите следующее из командной строки (пример для Windows Power Shell, но очень похож на UNIX):
magick convert --% Arial400_0.tga -filter Jinc ( +clone -negate -morphology Distance Euclidean -level 50%,-50% ) -morphology Distance Euclidean -compose Plus -composite -level 45%,55% -resize 25% Arial400_0.png
Далее нам нужно отредактировать файл Fnt. Добавьте следующее в заголовок Fnt мою руку перед определением Chars:
fieldType=sdf
Это скажет Font LIB использовать одноканальный шейдер SDF при использовании этого шрифта.
Для многоканальных SDF вы не можете использовать генератор шрифтов BM, вместо этого используйте: https://soimy.github.io/msdf-bmfont-xml/ с этим инструментом, вам необходимо запустить с файла TTF, но вы получите обычный файл FNT плюс файл PNG. После установки запустите следующее из командной строки:
msdf-bmfont -o multisdf.png cour.ttf
Обратите внимание, что вы можете предоставить размер шрифта и другие параметры через командную линию.
Это необязательно: сделайте определение для каждого нового шрифта, который вы добавляете в Fontlibrary .H, это должно облегчить кодирование!
// font type defines, string must match the filename without extension in your fonts folder!
# define GLFONT_COURIER42_MSDF " Courier42_msdf "
# define GLFONT_ARIAL20 " Arial20 "
# define GLFONT_DINNEXTLTPROMED_SDF " DINNextLTProMED_SDF ".. добавьте свои собственные определения здесь!