Rendre de l'art SVG directement dans XNA

36

Supposons que j'ai un tas d'art 2D dans un format vectorisé tel que SVG. Existe-t-il un moyen simple de générer directement ce rendu sans avoir à implémenter moi-même un rendu SVG complet?

Bien sûr, je pourrais le rasteriser hors ligne (dans le pipeline de contenu, par exemple) pour différentes résolutions / niveaux de zoom, mais je souhaite conserver les images nettes aux niveaux de zoom continus offerts par les graphiques vectoriels.

drxzcl
la source

Réponses:

24

Une bonne question J'essayais de le faire à un moment donné - je ne pouvais pas trouver une solution simple et prédéfinie. Mais laissez-moi vous indiquer certaines des ressources que j'ai trouvées en essayant de le mettre en œuvre moi-même:


Tout d'abord, il y a un article de GPU Gems 3: Rendering Vector Art sur le GPU (et le papier associé Loop-Blinn ).

Le plus difficile est que, si dessiner des courbes quadratiques est facile, les courbes cubiques (comme celles trouvées dans votre SVG typique) sont considérablement plus difficiles. L'article va dans les détails à ce sujet, mais vous devrez apporter votre chapeau de maths.

L'alternative au rendu des courbes cubiques consiste à convertir les courbes cubiques en courbes quadratiques. Également un problème non trivial.

Une fois que vous pouvez restituer des courbes vectorielles sur le GPU, il vous suffit d'analyser le fichier SVG de votre pipeline de contenu et de le transformer en un maillage que vous pouvez rendre. Au fait, analyser SVG est facile .

Une autre alternative, potentiellement plus simple, consiste à renoncer à toutes les courbes et à simplement trianguler une approximation linéaire de votre SVG.

Ces deux solutions nécessitent une triangulation - voici un triangulateur raisonnable adapté à XNA .


Comme alternative complètement différente, vous pouvez utiliser un "champ de distance" pour restituer les sprites avec des arêtes vives presque vectorielles.

Voici un article de Valve de SIGGRAPH 2007 expliquant comment procéder: Magnification améliorée avec test de l'alpha pour les textures vectorielles et les effets spéciaux (PDF)

La méthode de base ici est très facile à mettre en œuvre. La difficulté survient lorsque vous essayez de le faire supporter des angles vifs (quelque chose qui n’a été abordé que dans le document). Cette méthode a également des limitations assez sévères pour tout, sauf dessiner des formes simples. Il convient mieux au texte et aux décalques de l'interface utilisateur (comme Valve l'utilise pour).


Maintenant que j'ai dit tout cela - je dois dire que, selon mon expérience, tous les efforts déployés ici n'en valent pas la peine!

À moins que votre jeu ne soit basé principalement sur des effets de zoom vectoriel extrêmes , comme la très cool démo de Masagin , vous pouvez vous permettre de pré-restituer votre fichier SVG et d’utiliser simplement des techniques bitmap (plus faciles, mieux prises en charge, etc.).

(L'une des premières techniques qui vous viennent à l'esprit est la version haute résolution de vos sprites au format mip - mappage ( wiki ), qui vous donne l'indépendance de la résolution jusqu'à la taille maximale de votre sprite.)

Cet article de blog est probablement un bon point de départ pour ajouter le support de rendu SVG à votre pipeline de contenu XNA.

Andrew Russell
la source
Excellente réponse, merci! C'est beaucoup plus que assez de corde pour me pendre. En fin de compte, je vais probablement suivre votre conseil pour suivre la route des bitmap. En attendant, j'ai de la lecture à faire! : P
drxzcl
Cette réponse est-elle toujours exacte?
lochok
@ Lochok Oui. Rien dans ma réponse ne va soudainement cesser de fonctionner. Il est possible qu'une meilleure façon de créer des vecteurs soit développée à l'avenir - mais, au moment de la rédaction de ce document, je n'avais entendu parler de rien de nouveau.
Andrew Russell
Je voulais plus dire qu'il n'y avait pas de solution existante
lochok