Отображение SVG в OpenGL без промежуточного растра

У меня есть несколько простых работ SVG (значок и тип глифов), которые я хочу отобразить в приложении OpenGL (разработка на C ++ на Debian с использованием Qt).

Очевидное решение состоит в том, чтобы использовать библиотеки ImageMagick для преобразования SVG в растровые изображения и текстуры с их сопоставлением на некоторые подходящие полигоны (или просто использовать старые добрые glDrawPixels).

Тем не менее, мне интересно, есть ли что-то там, которое будет транслировать SVG непосредственно в последовательность вызовов OpenGL и отображать его с использованием линий OpenGL, полигонов и тому подобного. Кто-нибудь знает что-нибудь, что может это сделать?

Qt может это сделать.
QSvgRenderer может взять SVG и нарисовать его поверх QGLWidget
Возможно, вам придется рисовать с помощью paintEvent() abit, если вы хотите нарисовать что-нибудь еще в QGLWidget, отличном от SVG.

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

Похоже, у Inkscape есть интересные опции экспорта, которые могут вам пригодиться. Они include в себя DXF, PovRay, EPS, PS (PostScript), XAML, Latex и OpenDocument Drawing (ODG). Возможно, есть конвертер для одного из них, и вы можете использовать Inkscape в качестве посредника.

DXF, в частности, является вероятным кандидатом, поскольку он уже является обычным трехмерным форматом. assimp – хороший кандидат для загрузки DXF.

есть также tkzinc как возможность

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

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

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

NV_path_rendering теперь используется библиотекой Skia Google за кулисами, когда она доступна. (Nvidia предоставила код в конце 2013 и 2014 годах.) Кажется, что один из разработчиков Cairo (который является сотрудником Intel) тоже нравится http://lists.cairographics.org/archives/cairo/2013-March/024134 .html , хотя я еще не знаю каких-либо конкретных усилий для использования cairo для NV_path_rendering.

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

Я сделал программу векторного рисования под названием Omber, которая имеет некоторую способность импортировать SVG-файлы и может экспортировать векторные чертежи в «сплющенную» 3d модель в формате glTF 2.0. Формат glTF – это в значительной степени просто необработанные данные OpenGL, поэтому вы можете прочитать его и отобразить с минимальным кодом. Я написал небольшой плагин Pixi.js для отображения файлов glTF, содержащих векторное искусство, используя WebGL.

Blender также поддерживает импорт файлов SVG. Затем вы можете экспортировать результат в формат 3D-файла, но поддержка Blender для SVG больше предназначена для импорта простых кривых, а не сложных чертежей.

Я уверен, что есть и другие инструменты, которые также могут делать такие вещи. Одна из проблем заключается в том, что SVG предшествует современному графическому оборудованию, поэтому многие его функции являются реальной болью для реализации с OpenGL, особенно эффективным способом. Такие вещи, как непрозрачность на группах, gradleиенты неправильной формы, действия на основе растровых фильтров и т. Д., Могут стать беспорядочными, поэтому я не уверен, что более эзотерические функции SVG обычно поддерживаются программами, которые могут конвертировать объекты в 3d-форматы.

  • VectorDrawable - доступен ли он как-то для до-Lollipop версий Android?
  • CSS: прежде чем на встроенном SVG
  • Цвет фона текста в SVG
  • SVG перетаскивается с помощью JQuery и JQuery-svg
  • Форма треугольника с фоновым изображением
  • Как включить стиль CSS при преобразовании svg в png
  • Как использовать маркеры SVG в API Карт Google v3
  • Есть ли способ использовать SVG как контент в псевдоэлементе: до или: после
  • Создание SVG из LaTeX (tikz)?
  • Как преобразовать / сохранить график d3.js в pdf / jpeg
  • Как извлечь встроенное изображение из SVG-файла?
  • Давайте будем гением компьютера.