Текстовый движок OpenGL - PullRequest
1 голос
/ 26 марта 2012

Существуют ресурсы о том, как отображать шрифты в OpenGL (FTGL и т. Д.) ... Я не спрашиваю об этом. Я хочу знать, есть ли какие-либо опубликованные библиотеки, алгоритмы, статьи и т. Д. По работе с текстом в трехмерном пространстве, пересекающем геометрию. Например, если вы нарисуете метку в местоположении страны на трехмерной земле, геометрия часто будет пересекать землю. Я видел несколько примеров, которые всегда показывают всю этикетку, но затем, когда местоположение этикетки исчезает по всей земле, этикетка сжимается и / или исчезает.

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

Ответы [ 2 ]

1 голос
/ 27 октября 2012

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

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

  • Создайте текстуру, содержащую все символы шрифта, который вы хотите использовать.Либо визуализируйте каждый символ в требуемом размере, либо используйте поля со знаком, если вы хотите масштабировать текст до любого размера без значительной потери качества.Храните дополнительную информацию, такую ​​как координаты текстуры для каждого символа, а также информацию о кернинге, в отдельном файле.Отличный инструмент для создания текстур шрифтов с полем со знаком можно найти здесь .
  • Используя текстовую строку в качестве входных данных, создайте 2D-сетку, содержащую один квад (или 2 треугольника) для каждого символав тексте.Установите правильные координаты текстуры для каждой вершины.Кернинг и перенос слов могут быть выполнены правильно с использованием информации о шрифте.Для лучшей производительности сохраняйте сетку в объекте буфера вершин.
  • Чтобы отобразить текст, просто привяжите текстуру и визуализируйте сетку.

Точные подробности реализации выходят за рамки этого поста, но вы можете найти ссылку на пример кода в конце этого поста.

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

Хорошее решение состоит в том, чтобы закодировать трехмерное мировое положение вашей метки в вашей сетке и использоватьвершинный шейдер для перемещения каждой метки в соответствующую 2D позицию в каждом кадре.Все, что вам нужно сделать, это добавить атрибут вершины к каждой вершине в сетке (или использовать для этого координату трехмерной текстуры) и сохранить положение трехмерного мира.Фактическая вершина не должна указываться в мировых или экранных координатах, но должна быть относительно (0, 0).

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

Подобную реализацию системы, совместимой с Visual C ++ 2010, можно найти здесь .Посмотрите образец TextRendering для классов текстовой метки, и посмотрите образец Stars для информации о том, как его использовать.Этот код предназначен для использования с библиотекой Cinder C ++: http://libcinder.org

Видео с образцом звезд можно найти здесь .

1 голос
/ 04 августа 2012

Раньше я работал в 3D картографии.Это сложная проблема.Об этом много литературы.Вам нужно будет начать поиск и поиск в Google, на самом деле нет никакого способа обойти это.

Вот несколько подходов:

  • Нарисуйте метку на некоторой высоте над землей, попробуйтевыберите хорошую высоту
  • Попытайтесь обвести метку над землей (требуется вычисление)
  • Растеризуйте метки на текстуры, чтобы они были только частью изображения
  • Использование буфера трафаретатрюки, чтобы разрезать текст (или дороги и т. д.) в геометрию (могут пострадать от растяжения артефактов)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...