Rendern von SVG mit OpenGL (und OpenGL ES)
Ich bin derzeit auf der Untersuchung der Möglichkeit das Rendern von Vektor-Grafiken aus einer SVG-Datei mit Hilfe von OpenGL und OpenGL ES. Ich beabsichtige zum Ziel Windows und Android. Meine ideale Lösung wäre es, eine minimale C-Bibliothek erzeugt ein polygon-triangulation aus einer gegebenen SVG-Datei. Dies würde dann generieren Sie standard-OpenGL oder OpenGL ES nennt, und die Verwendung von display-Liste oder vbo für die Optimierung beim Neuaufbau. Ich würde einfach zeichnen Sie eine display-Liste zu zeichnen, die Vektor-Bild nach dem übersetzen und drehen, so dass ich mischen diese mit anderen OpenGL-Aufrufe.
So weit ich sehe, sind die Vorschläge zu Erstens QT oder Cairo. - Dies ist keine option, da möchte ich die Verwaltung meiner eigenen OpenGL-Kontext ohne aufgeblähte Bibliotheken (im Rahmen dessen, was ich versuche zu erreichen). Noch ist das geeignet für Android.
Zweite option ist die Verwendung von Bibliotheken, die das Rendern auf eine textur. Das mag ok sein für statische Vektor-Grafik, es ist keine wirksame oder durchführbare option für Spiele, wo die Skalierung und Rotationen auftreten, Häufig.
Drittens gibt es die Möglichkeit, mit OpenVG. Es gibt einige opensource Implementierungen der OpenVG Spezifikation (ShivaVG etc), aber ich bin noch zu finden, eine Bibliothek, die fähig ist, die entsprechenden OpenVG Anrufe von einem gegebenen SVG-Datei zur Laufzeit, und ich kann nicht sehen, wie um dies zu optimieren, wie wir uns das wünschen würden, um mit einer display-Liste oder vbo.
Alle drei Methoden leiden unter Einschränkungen. Ich denke, der vielversprechendste option ist die Verwendung eine OpenVG-Implementierung, wenn keine andere Lösung vorhanden ist. Also meine Frage ist, gibt es Bibliotheken gibt, die das tun, was ich will, oder nahe an dem, was ich will? Wenn nicht, gibt es einen guten Grund gibt, warum nicht? Und wäre es besser zu versuchen, diese aus dem Boden nach oben statt?
InformationsquelleAutor der Frage Matt Esch | 2011-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom http://shivavg.svn.sourceforge.net/viewvc/shivavg/trunk/src/shPipeline.c?revision=14&view=markup :
Also es wird ein VBO. Also ich würde vorschlagen, machen Sie Ihre eigenen SVG-parser /verwenden Sie ein pre-made-man, und leiten die Anrufe an ShivaVG.
Haben Sie immer noch das problem, dass ShivaVG ist in C (und nicht in Java) und erzeugt einen opengl-Kontext (und nicht opengles, wenn ich Lesen Sie den code korrekt). Also selbst wenn Sie es kompilieren mit Android NDK, müssen Sie den code ändern ( zum Beispiel, ich habe ein paar gesehen glVertex3f herum, aber Sie scheinen nicht zu viel gebraucht... das beste hoffen). Die andere option, natürlich, ist es um die Portierung des Codes von C nach Java. Vielleicht nicht so schmerzhaft wie man sich vorstellen kann.
Glück !
InformationsquelleAutor der Antwort Calvin1602
Check-out MonkVG eine OpenVG wie API-Implementierung auf der Oberseite von OpenGL ES.
Auch für SVG-rendering auf der Oberseite der OpenVG (MonkVG) Kasse MonkSVG.
MonkVG wurde für iOS -, OSX-und Android-Plattformen.
Ich bin der Autor der beiden Bibliotheken und würde glücklich sein, auf irgendwelche Fragen zu Antworten.
InformationsquelleAutor der Antwort micahp
Meine Antwort wird über die Anzeige von Vektor-Grafiken mit OpenGL im Allgemeinen, weil alle Lösungen für dieses problem kann die Unterstützung eher trivial SVG-insbesondere, aber keine Unterstützung animierte SVGs (SMIL). Da gab es nichts, sagte über animation, ich nehme an, die Frage impliziert statische SVGs nur.
Zuerst, ich würde nicht die Mühe mit etwas, OpenVG, auch nicht mit MonkVG, was wahrscheinlich die meisten modernen, wenn auch unvollständigen Umsetzung. Die OpenVG-Ausschuss gefaltet hat, im Jahr 2011, und die meisten, wenn nicht alle Implementierungen sind abandonware oder am besten legacy-software.
Seit 2011, der Stand der Technik ist Mark Kilgard ' s baby, NV_path_renderingdie derzeit nur ein Hersteller (Nvidia) Erweiterung, wie Sie schon erraten haben vielleicht schon von seinem Namen. Es gibt eine Menge von Material, dass:
Natürlich können Sie laden SVGs und solche https://www.youtube.com/watch?v=bCrohG6PJQE. Sie unterstützen auch die PostScript-syntax für Pfade. Sie können auch mischen Pfad rendering mit anderen OpenGL (3D) Zeug, als führten Sie unter:
NV_path_rendering wird jetzt von Google-Bibliothek Skia hinter den kulissen, wenn verfügbar. (Nvidia trug Sie den code in spät 2013 und 2014.) Einer der Kairo-Entwickler (wer ist ein Mitarbeiter von Intel) scheint es zu http://lists.cairographics.org/archives/cairo/2013-March/024134.htmlobwohl ich [noch] nicht bewusst keine konkreten Bemühungen für Kairo zu verwenden NV_path_rendering.
NV_path_rendering hat einige kleinere Abhängigkeiten auf die fixed pipeline, so kann es ein bisschen lästig für die Verwendung in OpenGL ES. Dieses Problem dokumentiert in der offiziellen extension-doc weiter oben verlinkt. Für einen workaround siehe zum Beispiel, was Skia/Chrom getan hat: https://code.google.com/p/chromium/issues/detail?id=344330
Einen Emporkömmling, der mit noch weniger (oder gar keine) Unterstützung durch den Anbieter oder akademischen glitz NanoVGdie derzeit entwickelt und gepflegt. (https://github.com/memononen/nanovg) Gegeben, die Anzahl der 2D-Bibliotheken über OpenGL, die sind gekommen und gegangen im Laufe der Zeit, Sie nehmen eine große Wette mit so etwas nicht unterstützt, die von einem großen Hersteller, meiner bescheidenen Meinung nach.
InformationsquelleAutor der Antwort Fizz
Wenn Sie nur wollen, zu transformieren SVG Vektor-Grafiken in OpenGL|ES, dann schlage ich zu tun, den parser und die Logik selbst. Beachten Sie, dass SVG ist eine große spec, mit verschiedenen Funktionen, wie paint-Server (Farbverläufe, Muster ...), Referenzen, Filter, clipping, Behandlung von Schriften, Animationen, scripting, Anbindung, etc, etc.
Wenn Sie wollen die volle svg-Unterstützung, dann gibt es eine Bibliothek auf http://code.google.com/p/enesim genannt egueb (und besonders esvg), die verwendet enesim (eine rendering-Bibliothek, die software-und opengl-Backend) für die Zeichnung. In den meisten Fällen wird es verwendet, Shader und alles Rendern in eine textur, die Bibliothek ist sehr flexibel und ermöglicht Ihnen das anpassen auf Ihre speziellen Bedürfnisse, wie das ändern der Darstellung, transformieren, etc. Da die gl-Zeichnung erfolgt immer in eine textur.
In dem besonderen Fall der gl-backend, enesim nicht eine GLX (oder jedem anderen Fenster abhängig Kontext) haben Sie zu bieten, so dass es passt sich perfekt an Ihre situation, wie es verwendet nur GL-Aufrufe.
Der einzige Nachteil ist, dass die Bibliothek noch nicht komplett ist im Sinne der gl-Unterstützung oder vollständige SVG-Spezifikation unterstützen, aber je nach Ihren Bedürfnissen, scheint mir wie eine gute option.
InformationsquelleAutor der Antwort turran
Es muss gesagt werden, dass das Rendern von SVG-oder OpenVG mit OpenGL oder OpenGL ES ist grundsätzlich eine schlechte Idee. Es gibt Gründe, die OpenVG-Implementierungen sind alle so langsam und weitgehend aufgegeben. Der Prozess der parkettierung Pfade (die Grundlage aller SVG/OpenVG rendering) in Dreieck-Listen, wie Sie durch OpenGL ist grundsätzlich langsam und ineffizient. Es ist im Grunde erfordert das einfügen eines sort/search-Algorithmus in der 3D-rendering-pipeline, die Krüppel Leistung. Es gibt auch das problem, dass eine dynamische Zuweisung von Speicher Regelung ist erforderlich, weil die Größe der Daten ist unbekannt, da SVG stellen keine Grenzen für die Komplexität des Pfad-geometrie. Ein wirklich schlechtes design.
SVG und OpenVG wurden erstellt von Entwicklern, die hatten wenig Verständnis dafür, wie moderne 3D-Grafik-hardware, die Motoren tatsächlich arbeiten (Dreiecks-Listen). Sie wurden geschaffen, um eine offene alternative zu Adobe Flash, die auch die gleiche fehlerhafte Architektur gemacht hat, dass Flash geschmäht in der Branche für nicht vorhersehbare performance.
Mein Tipp: überdenken Sie Ihre design-und OpenGL-Dreieck-Listen direkt. Möglicherweise haben Sie mehr code schreiben, aber Ihre app ausführen, etwa tausend mal besser und Sie können leichter Debuggen von code, als jemand elses.
InformationsquelleAutor der Antwort ClayMontgomery
Können Sie einen Blick auf AmanithVGscheinen Sie umgesetzt haben, ist ein guter Weg -> Dreiecke pipeline. Ich habe versucht, die iOS-GL-tiger-Beispiel, und es scheint, dass triangulation nicht ein echtes Nadelöhr.
InformationsquelleAutor der Antwort mirknac