Rendering di arte SVG direttamente in XNA


36

Supponiamo che io abbia un sacco di arte 2D in un formato vettoriale come SVG. Esiste un modo semplice per renderlo direttamente senza dover implementare un renderer SVG completo da solo?

Ovviamente potrei rasterizzarlo off-line (ad esempio nella pipeline di contenuti) per diverse risoluzioni / livelli di zoom, ma vorrei mantenere le immagini nitide a livelli di zoom continui offerti dalla grafica vettoriale.

Risposte:


24

Una buona domanda Stavo sperimentando questo ad un certo punto: non riuscivo a trovare una soluzione semplice e pre-costruita. Ma lascia che ti indichi alcune delle risorse che ho trovato quando ho tentato di implementarlo da solo:


Prima di tutto c'è un articolo di GPU Gems 3: Rendering di grafica vettoriale sulla GPU (e il relativo documento Loop-Blinn ).

La parte più difficile è che, mentre disegnare curve quadratiche è facile, le curve cubiche (come quelle che si trovano nel tipico SVG) sono considerevolmente più dure. L'articolo approfondisce questo aspetto, ma dovrai portare il tuo cappello di matematica.

L'alternativa al rendering di curve cubiche è quella di convertire le curve cubiche in quadratiche. Anche un problema non banale.

Una volta che è possibile eseguire il rendering di curve vettoriali sulla GPU, si tratta semplicemente di analizzare SVG nella pipeline di contenuti e trasformarlo in una mesh che è possibile eseguire il rendering. A proposito, analizzare SVG è facile .

Un'altra alternativa, potenzialmente più semplice, è quella di rinunciare alle curve tutte insieme e triangolare semplicemente un'approssimazione lineare del tuo SVG.

Entrambe queste soluzioni richiedono triangolazione: ecco un triangolatore ragionevole adatto a XNA .


Come alternativa completamente diversa, è possibile utilizzare un "campo di distanza" per eseguire il rendering di sprite con spigoli vivi quasi simili a vettori.

Ecco un articolo di Valve di SIGGRAPH 2007 su come eseguire questa operazione: Miglioramento della prova alfa testata per trame vettoriali ed effetti speciali (PDF)

Il metodo di base qui è molto facile da implementare. La difficoltà si presenta quando si tenta di farlo supportare angoli acuti (qualcosa toccato solo sul foglio). Questo metodo ha anche alcune limitazioni piuttosto severe per tutto tranne che disegnare forme semplici. È più adatto al testo dell'interfaccia utente e alle decalcomanie (come Valve lo sta usando per).


Ora che ho detto tutto ciò, devo dire che, nella mia esperienza, tutto lo sforzo qui non ne vale la pena!

A meno che il tuo gameplay non sia basato principalmente su effetti di zoom vettoriale estremi come la fantastica demo di Masagin , puoi cavartela con il pre-rendering del tuo SVG e semplicemente usando tecniche bitmap (più facile, meglio supportate, ecc.).

(Una delle prime tecniche che mi viene in mente è il mipmapping ( wiki ) versioni ad alta risoluzione dei tuoi sprite, per darti l'indipendenza di risoluzione fino alla dimensione massima dello sprite.)

Questo post sul blog è probabilmente un buon punto di partenza per aggiungere il supporto per il rendering SVG alla tua pipeline di contenuti XNA.


Ottima risposta, grazie! È molto più che sufficiente corda per appendermi. Alla fine, probabilmente prenderò il tuo consiglio per seguire il percorso bitmap. Nel frattempo, ho qualche lettura da fare! : P
drxzcl,

Questa risposta è ancora accurata?
Lochok,

@lochok Sì. Non c'è nulla nella mia risposta che smetterà improvvisamente di funzionare. È possibile che in futuro possa essere sviluppato un modo migliore di fare vettori - ma, al momento della stesura, non ho sentito parlare di nulla di nuovo.
Andrew Russell,

Intendevo dire che non esisteva alcuna soluzione
lochok il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.