Подтвердить что ты не робот

Рендеринг векторной графики в OpenGL?

Есть ли способ загрузить векторный графический файл, а затем визуализировать его с помощью OpenGL? Это неопределенный вопрос, поскольку я мало знаю о форматах файлов для векторной графики. Однако я знаю SVG.

Включение его в растровое изображение не очень полезно, так как я хочу делать масштабирование в реальном времени на объектах.

4b9b3361

Ответ 1

Позвольте мне расширить ответ Грега.

Верно, что Qt имеет класс рендеринга SVG, QSvgRenderer. Кроме того, любой чертеж, который вы делаете в Qt, может быть выполнен на любом "QPaintDevice", где нас интересуют следующие "устройства рисования":

  • Виджет Qt;
  • В частности, Qt-виджет на основе GL (QGLWidget);
  • Изображение Qt

Итак, если вы решите использовать Qt, ваши варианты:

  • Прекратите использование текущего метода настройки окна (и контекста GL) и начните использовать QGLWidget для всего вашего рендеринга, включая рендеринг SVG. Это может быть довольно небольшим изменением, в зависимости от ваших потребностей. QGLWidget не особенно ограничивает его возможности.
  • Используйте QSvgRenderer для рендеринга в QImage, затем поместите данные из этого QImage в текстуру GL (как обычно) и сделайте ее любым способом (например, в прямоугольном GL_QUAD). Может иметь худшую производительность, чем другой метод, но требует наименьшего изменения вашего кода.

Интересно, что именно делает QGLWidget? Ну, когда вы выдаете команды Qt-рендеринга в QGLWidget, они переводятся на вызовы GL для вас. И это также происходит, когда команды рендеринга выдаются визуализатором SVG. Итак, в конце концов, ваш SVG будет в конечном итоге визуализироваться через кучу примитивов GL (линии, полигоны и т.д.).

Это имеет недостаток. Различные видеокарты реализуют OpenGL несколько иначе, и Qt не учитывает (и не может) учет всех этих различий. Так, например, если у вашего пользователя есть дешевая встроенная видеокарта Intel, то его видеокарка не поддерживает сглаживание OpenGL, и это означает, что ваш SVG также будет выглядеть как псевдоним (jaggy), если вы передадите его непосредственно QGLWidget. Прохождение QImage позволяет избежать таких проблем.

Вы можете использовать метод QImage при масштабировании в реальном времени. Это зависит от того, насколько быстро вам это нужно. Вам может потребоваться тщательная оптимизация, такая как повторное использование одного и того же QImage и возможность отсечения для вашего QPainter.

Ответ 2

Я вижу, что большинство ответов касаются Qt каким-то образом, хотя исходный вопрос не упоминает об этом. Здесь мой ответ только с точки зрения OpenGL (что также сильно зависит от времени, как это не могло быть дано в 2010 году):

С 2011 года современное состояние - ребенок Марка Килгарда, NV_path_rendering, который в настоящее время является только расширением поставщика (Nvidia), как вы уже догадались с его имени. На нем много материалов:

NV_path_rendering теперь используется библиотекой Google Skia за кулисами, когда это доступно. (Nvidia внесла код в конце 2013 и 2014 гг.)

Конечно, вы можете загружать SVG и такие https://www.youtube.com/watch?v=bCrohG6PJQE. Они также поддерживают синтаксис PostScript для путей. Вы также можете смешивать рендеринг маршрута с другими материалами OpenGL (3D), как показано на странице:

У выскочки, имеющей еще меньшую (или совершенно нет) поддержку поставщика или академический блеск, NanoVG, который в настоящее время разрабатывается и поддерживается. (https://github.com/memononen/nanovg) Учитывая количество 2D-библиотек поверх OpenGL, которые приходят и уходят со временем, вы делаете большую ставку, используя что-то не поддержанный крупным поставщиком, по моему скромному мнению.

Ответ 3

Это не реализация, но очень актуальная для вашего вопроса и зрителей.

Глава 25. Оказание векторного искусства на графическом процессоре http://http.developer.nvidia.com/GPUGems3/gpugems3_ch25.html

Ответ 4

Qt имеет хорошую поддержку для прямого отображения изображений SVG с использованием функций OpenGL (см. документацию для QSvgRenderer).

Я надеюсь, что это поможет.

Ответ 5

В нем есть примитивы, такие как GL_LINES и GL_LINE_STRIP для рисования линий в пространстве, если это то, что вы имеете в виду. Изменить: на этом сайте есть информация: http://www.falloutsoftware.com/tutorials/gl/gl2p5.htm