2009-06-22 12 views
28

Mam kilka prostych grafik SVG (ikon i symboli glifów), które chcę wyświetlić w aplikacji OpenGL (rozwijając C++ w Debianie, używając Qt).Wyświetlanie SVG w OpenGL bez pośredniego rastra

Oczywistym rozwiązaniem jest użycie bibliotek ImageMagick do convert obrazów SVG do obrazów rastrowych i tekstur na kilku odpowiednich poligonach (lub po prostu za pomocą dobrych starych glDrawPixels).

Zastanawiam się jednak, czy jest coś, co przetłumaczy SVG bezpośrednio na sekwencje wywołań OpenGL i wyrenderuje je za pomocą linii OpenGL, wielokątów i tym podobnych. Czy ktoś wie o wszystkim, co może to zrobić?

+2

hmm .. trudny problem, gdy występują krzywe Beziera. Byłoby miło zobaczyć rozwiązanie, ponieważ obie technologie dobrze się uzupełniają. – SpliFF

+1

Kwestia ta została ponownie poprosił o http://stackoverflow.com/questions/6287650/rendering-svg-with-opengl-and-opengl-es/ – Fizz

Odpowiedz

12

Qt może to zrobić.
QSvgRenderer może SVG i pomalować ją na QGLWidget
Its ewentualnie trzeba bawić się wokół z paintEvent() abit jeśli chcesz narysować niczego innego na QGLWidget inne niż SVG.

+0

Dzięki, bardzo ciekawe (należy zauważyć, że jednym ja). Z dokumentacji nie jest jasne, czy aspekt wektorowy zostanie całkowicie zachowany w QPainter-on-QGLWidget, czy też nastąpi pośrednia rasteryzacja. Powinien być łatwy do wykrycia przy użyciu GLintercept/GLtrace ... – timday

+0

QPainter zwykle nie wykonuje żadnej rasteryzacji. Nie ma powodu, aby zacząć to robić w przypadku SVG. – shoosh

+0

Po uzyskaniu GLTrace do pracy z aplikacjami Qt4 na mojej platformie (prosta poprawka, wysłana do autora), mogę potwierdzić, że SVG jest rysowany na GLWidget przy użyciu imponującej liczby połączeń gl *. Trolltech stanowi dobry przykład połączenia światów 2D i 3D na http://doc.trolltech.com/4.4/opengl-overpainting.html. Jedyne, co mogę sobie wyobrazić chcąc zrobić dalej, to przechwytywanie wywołań renderowania SVG na liście wyświetlania GL (chociaż jedynym powodem, dla którego to zrobię, byłaby wydajność, a jeśli stałoby się to problemem, byłbym bardziej skłonny do buforowania renderowanych bitmap zamiast). – timday

5

SVGL wydaje się rozwiązać ten problem, ale od kilku lat jest nieaktywny. Nadal możesz znaleźć tam jakiś kod wartości.

+0

Projekt "sauvage" wspomniany przez "dru" poniżej wydaje się być następcą. Ten sam autor, ale python, a nie C++. – timday

2

Wygląda na to, że Inkscape ma kilka interesujących opcji eksportu, które mogą Ci się przydać. Należą do nich: DXF, PovRay, EPS, PS (PostScript), XAML, Latex i OpenDocument Drawing (ODG). Być może istnieje konwerter jednego z nich i możesz użyć Inkscape jako pośrednika.

DXF jest prawdopodobnym kandydatem, ponieważ jest to powszechny format 3D. assimp jest dobrym kandydatem do ładowania DXF.

+0

Inkscape nie ma jeszcze pełnej implementacji SVG, więc wyobrażam sobie, że jej opcje eksportu są również częściowe. – shoosh

+0

Właściwie wszystkie pliki SVG, których używam, są tworzone w Inkscape, tak długo, jak można eksportować wszystkie własne rzeczy ... bez problemu. – timday

+1

W każdym razie będziesz bardziej ograniczony formatem wyjściowym niż SVG. DXF ma milion lat, nie będzie obsługiwać znaków cięcia ani skomplikowanych gradientów. – SpliFF

1

istnieje również tkzinc jako możliwość

1

Moja odpowiedź zamierza o wyświetlaniu grafiki wektorowej wtih OpenGL w ogóle, ponieważ wszystkie rozwiązania tego problemu może obsługiwać dość trywialnie SVG w szczególności, choć poparcie brak animowane SVG (SMIL). Ponieważ nie było nic o animacji, zakładam, że pytanie dotyczy tylko statycznych SVG.

Od 2011 roku, stan techniki jest Mark Kilgard Dziecko, NV_path_rendering, który jest obecnie tylko sprzedawca (Nvidia) rozszerzenie jak można się domyślić już od jego nazwy. Istnieje wiele materiałów na ten temat:

można oczywiście pomostów żylnych obciążenia i tak https://www.youtube.com/watch?v=bCrohG6PJQE. Obsługują również składnię PostScript dla ścieżek.Można również mieszać ścieżkę renderowania z drugiej OpenGL (3D) rzeczy, jak demoed w:

NV_path_rendering jest obecnie wykorzystywana przez bibliotekę dzięki technice Skia Google za kulisami, kiedy będą dostępne. (Nvidia dodała kod pod koniec 2013 i 2014 roku.) Jeden z twórców cairo (który również jest pracownikiem Intela) też wydaje się to lubić http://lists.cairographics.org/archives/cairo/2013-March/024134.html, chociaż nie jestem [jeszcze] świadomy żadnych konkretnych wysiłków, aby cairo mógł go użyć NV_path_rendering.

Nowością, która ma jeszcze mniej (lub wręcz nie ma) wsparcia dla dostawców lub akademickich blichtru jest NanoVG, która jest obecnie rozwijana i utrzymywana. (https://github.com/memononen/nanovg) Biorąc pod uwagę liczbę bibliotek 2D na OpenGL, które pojawiły się i zniknęły z biegiem czasu, bierzesz duży zakład za pomocą czegoś, co nie jest obsługiwane przez głównego dostawcę, w mojej skromnej opinii.

Powiązane problemy