Отображение SVG в OpenGL без промежуточного растра - PullRequest
28 голосов
/ 22 июня 2009

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

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

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

Ответы [ 5 ]

12 голосов
/ 22 июня 2009

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

5 голосов
/ 22 июня 2009

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

2 голосов
/ 06 августа 2014

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

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

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

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

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

2 голосов
/ 22 июня 2009

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

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

1 голос
/ 22 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...