Рендеринг векторной графики в OpenGL?
Есть ли способ загрузить векторный графический файл, а затем визуализировать его с помощью OpenGL? Это неопределенный вопрос, поскольку я мало знаю о форматах файлов для векторной графики. Однако я знаю SVG.
Включение его в растровое изображение не очень полезно, так как я хочу делать масштабирование в реальном времени на объектах.
Ответы
Ответ 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