Rendre des graphiques vectoriels dans OpenGL? [dupliquer]
Cette question a déjà une réponse ici:
y a-t-il un moyen de charger un fichier graphique vectoriel puis de le rendre en utilisant OpenGL? C'est une question vague car je ne sais pas grand chose sur les formats de fichiers pour les graphiques vectoriels. Je sais de SVG.
tournant il à raster n'est pas vraiment utile car je veux faire en temps réel zoomant sur les objets.
5 réponses
Permettez-moi de développer la réponse de Greg.
il est vrai que Qt a une classe SVG renderer, Qsvgrender. Aussi, n'importe quel dessin que vous faites dans Qt peut être fait sur N'importe quel "QPaintDevice", où nous sommes intéressés par les "dispositifs de peinture"suivants:
- un widget Qt;
- En particulier, un GL à base de widget Qt (QGLWidget);
- une image Qt
donc, si vous décidez d'utiliser Qt, vos options sont:
- arrêter d'utiliser votre courant méthode pour configurer la fenêtre (et le contexte GL), et commencer à utiliser QGLWidget pour tout votre Rendu, le rendu SVG. Cela pourrait être un petit changement, selon vos besoins. QGLWidget n'est pas particulièrement limité dans ses capacités.
- utilisez QSvgRenderer pour rendre à un QImage, puis mettez les données de ce QImage dans une texture GL (comme vous le feriez normalement), et le rendre de n'importe quelle façon que vous voulez (par exemple dans un gl_quad rectangulaire). Pourrait avoir de moins bonnes performances que l'autre méthode, mais nécessite le moins de changement dans votre code.
vous vous demandez ce que QGLWidget fait exactement? Quand vous lancez des commandes de rendu Qt à un QGLWidget, elles sont traduites en appels GL pour vous. Et cela se produit également lorsque les commandes de rendu sont émises par le renderer SVG. Donc, à la fin, votre SVG va finir par être rendu via un tas de primitives GL (lignes, polygones, etc.).
cela présente un inconvénient. Différentes videocards mettent en œuvre OpenGL est légèrement différent, et Qt ne tient pas (et ne peut pas) compte de toutes ces différences. Ainsi, par exemple, si votre utilisateur dispose d'une vidéocard Intel à bord bon marché, alors sa vidéocard ne supporte pas OpenGL antialiasing, et cela signifie que votre SVG aura aussi l'air d'un alias (jaggy), si vous le rendez directement à un QGLWidget. Passer par un QImage permet d'éviter de tels problèmes.
Vous utilisez aussi la méthode QImage lorsque vous zoomez en temps réel. Tout dépend à quelle vitesse vous besoin de l'être. Vous aurez peut-être besoin d'une optimisation soigneuse, comme réutiliser le même QImage, et activer le clipping pour votre QPainter.
je vois que la plupart des réponses sont à propos de Qt d'une certaine façon, même si la question originale ne le mentionne pas. Voici ma réponse en termes D'OpenGL seul (qui bénéficie aussi grandement du passage du temps, comme il n'aurait pas pu être donné en 2010):
depuis 2011, L'état de l'art est le bébé de Mark Kilgard,NV_path_rendering, qui n'est actuellement qu'une extension de vendeur (NVIDIA) comme vous l'avez peut-être déjà deviné à partir de son nom. Il y a beaucoup de matériaux sur que:
- https://developer.nvidia.com/nv-path-rendering Nvidia hub, mais certaines matières sur la page de destination n'est pas le plus up-to-date
- http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/opengl/gpupathrender.pdf Siggraph 2012 document
- http://on-demand.gputechconf.com/gtc/2014/presentations/S4810-accelerating-vector-graphics-mobile-web.pdf GTC 2014 présentation
- http://www.opengl.org/registry/specs/NV/path_rendering.txt extension officielle doc
NV_path_rendering est maintenant utilisé par la bibliothèque Skia de Google dans les coulisses, lorsqu'il est disponible. (Nvidia a fourni le code à la fin de 2013 et en 2014.)
bien sûr, Vous pouvez charger SVGs et ces https://www.youtube.com/watch?v=bCrohG6PJQE. Ils prennent également en charge PostScript syntaxe pour les chemins. Vous pouvez également mixer le rendu des chemins avec d'autres OpenGL (3D) des trucs, comme démontré à:
un nouveau venu qui a encore moins (ou carrément pas) de soutien du vendeur ou de brillance académique est NanoVG, qui est actuellement développé et maintenu. (https://github.com/memononen/nanovg) étant donné le nombre de bibliothèques 2D sur OpenGL qui ont au fil du temps, vous prenez un gros pari en utilisant quelque chose qui n'est pas supporté par un vendeur important, à mon humble avis.
ce n'est pas une implémentation, mais très pertinent pour votre question et les téléspectateurs.
Chapitre 25. Rendre L'Art vectoriel sur le GPU https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
Qt a un bon support pour rendre directement des images SVG en utilisant la fonctionnalité OpenGL (voir la documentation pour QSvgRenderer