Хотя я не могу рекомендовать подходящую библиотеку, я знаю чрезвычайно эффективный способ рендеринга двухмерных текстовых меток в трехмерном мире.
Давайте сначала обсудим наиболее эффективный способ рендеринга любого двухмерного текста в OpenGL.а затем применить эти знания для текстовых меток, которые должны двигаться, когда камера движется.Отличный способ визуализации текста выглядит следующим образом:
- Создайте текстуру, содержащую все символы шрифта, который вы хотите использовать.Либо визуализируйте каждый символ в требуемом размере, либо используйте поля со знаком, если вы хотите масштабировать текст до любого размера без значительной потери качества.Храните дополнительную информацию, такую как координаты текстуры для каждого символа, а также информацию о кернинге, в отдельном файле.Отличный инструмент для создания текстур шрифтов с полем со знаком можно найти здесь .
- Используя текстовую строку в качестве входных данных, создайте 2D-сетку, содержащую один квад (или 2 треугольника) для каждого символав тексте.Установите правильные координаты текстуры для каждой вершины.Кернинг и перенос слов могут быть выполнены правильно с использованием информации о шрифте.Для лучшей производительности сохраняйте сетку в объекте буфера вершин.
- Чтобы отобразить текст, просто привяжите текстуру и визуализируйте сетку.
Точные подробности реализации выходят за рамки этого поста, но вы можете найти ссылку на пример кода в конце этого поста.
Чтобы отобразить двухмерные текстовые метки в 3DМир, нам придется обновлять положение каждой метки каждый раз, когда камера движется.Для этого потребуется воссоздавать сетку в каждом кадре, что может потребовать значительных ресурсов процессора и может снизить частоту кадров до недопустимых уровней.
Хорошее решение состоит в том, чтобы закодировать трехмерное мировое положение вашей метки в вашей сетке и использоватьвершинный шейдер для перемещения каждой метки в соответствующую 2D позицию в каждом кадре.Все, что вам нужно сделать, это добавить атрибут вершины к каждой вершине в сетке (или использовать для этого координату трехмерной текстуры) и сохранить положение трехмерного мира.Фактическая вершина не должна указываться в мировых или экранных координатах, но должна быть относительно (0, 0).
При рисовании сетки ваш вершинный шейдер затем считывает трехмерную позицию из атрибута или координаты текстуры,преобразует его в пространство экрана и смещает вершину.Несмотря на то, что это кажется неэффективным, тот факт, что все данные необходимо отправлять на графический процессор только один раз, а вся обработка выполняется на графическом процессоре параллельно без участия вашего процессора, позволяет отображать тысячи двумерных меток с очень высокой частотой кадров.
Подобную реализацию системы, совместимой с Visual C ++ 2010, можно найти здесь .Посмотрите образец TextRendering для классов текстовой метки, и посмотрите образец Stars для информации о том, как его использовать.Этот код предназначен для использования с библиотекой Cinder C ++: http://libcinder.org
Видео с образцом звезд можно найти здесь .