Renderizando arte SVG diretamente no XNA

36

Suponha que eu tenha um monte de arte 2D em algum formato vetorizado, como SVG. Existe uma maneira fácil de renderizar isso diretamente, sem a necessidade de implementar um renderizador SVG completo?

É claro que eu poderia rasterizá-lo off-line (por exemplo, no pipeline de conteúdo) para diferentes resoluções / níveis de zoom, mas eu gostaria de manter os visuais nítidos em níveis de zoom contínuo que os gráficos vetoriais oferecem.

drxzcl
fonte

Respostas:

24

Uma boa pergunta Eu estava experimentando isso em um ponto - não consegui encontrar uma solução fácil e pré-criada. Mas deixe-me apontar alguns dos recursos que encontrei ao tentar implementá-lo pessoalmente:


Antes de tudo, há um artigo da GPU Gems 3: Rendering Vector Art na GPU (e no artigo Loop-Blinn associado ).

A parte mais difícil é que, embora desenhar curvas quadráticas seja fácil, as curvas cúbicas (como as encontradas no SVG típico) são consideravelmente mais difíceis. O artigo entra em detalhes sobre isso, mas você precisará trazer seu chapéu de matemática.

A alternativa para renderizar curvas cúbicas é converter as curvas cúbicas em quadráticas. Também é um problema não trivial.

Depois de renderizar curvas de vetor na GPU, é simples analisar o SVG no pipeline de conteúdo e transformá-lo em uma malha que você pode renderizar. Analisar SVG é fácil , a propósito.

Outra alternativa potencialmente mais fácil é abrir mão de curvas e simplesmente triangular uma aproximação linear do seu SVG.

Ambas as soluções requerem triangulação - eis um triangulador razoável adequado ao XNA .


Como uma alternativa completamente diferente, você pode usar um "campo de distância" para renderizar sprites com bordas afiadas semelhantes a vetores.

Aqui está um documento da Valve da SIGGRAPH 2007 sobre como fazer isso: Maior ampliação testada em alfa para texturas de vetores e efeitos especiais (PDF)

O método básico aqui é muito fácil de implementar. A dificuldade surge ao tentar fazer com que ele suporte cantos afiados (algo que apenas foi mencionado no papel). Esse método também possui algumas limitações bastante severas para qualquer coisa, exceto desenhar formas simples. É mais adequado ao texto e decalques da interface do usuário (como a Valve está usando).


Agora que eu disse tudo isso - tenho que dizer que, na minha experiência, todo o esforço aqui não vale a pena!

A menos que sua jogabilidade se baseie principalmente em efeitos extremos de zoom vetorial, como a muito legal demo Masagin , você pode fazer uma pré-renderização de seu SVG e simplesmente usar técnicas de bitmap (mais fácil, melhor suportado etc.).

(Uma das primeiras técnicas que vem à mente é a versão mipmapping ( wiki ) de alta resolução de seus sprites, para garantir independência de resolução até o tamanho máximo do sprite.)

Esta postagem no blog é provavelmente um bom lugar para começar a adicionar suporte de renderização SVG ao seu pipeline de conteúdo XNA.

Andrew Russell
fonte
Excelente resposta, obrigado! Isso é corda mais que suficiente para me enforcar. No final, provavelmente vou seguir seu conselho para seguir a rota de bitmap. Enquanto isso, tenho algumas leituras para fazer! : P
drxzcl
Essa resposta ainda é precisa?
lochok
@lochok Sim. Não há nada na minha resposta que de repente pare de funcionar. É possível que uma maneira melhor de criar vetores possa ser desenvolvida no futuro - mas, no momento em que escrevo, não ouvi nada de novo.
Andrew Russell
I moreso significava que haja solução não existente
lochok