Renderizar arte SVG directamente en XNA

36

Supongamos que tengo un montón de arte 2D en algún formato vectorizado como SVG. ¿Hay una manera fácil de renderizar eso directamente sin tener que implementar un renderizador SVG completo?

Por supuesto, podría rasterizarlo fuera de línea (por ejemplo, en la tubería de contenido) para diferentes resoluciones / niveles de zoom, pero me gustaría mantener las imágenes nítidas en niveles de zoom continuo que ofrecen los gráficos vectoriales.

drxzcl
fuente

Respuestas:

24

Una buena pregunta Estaba experimentando con esto en un punto: no pude encontrar una solución fácil y preconstruida. Pero permítame señalarle algunos de los recursos que encontré al intentar implementarlo yo mismo:


En primer lugar, hay un artículo de GPU Gems 3: Rendering Vector Art en la GPU (y el papel Loop-Blinn asociado ).

La parte más difícil es que, aunque dibujar curvas cuadráticas es fácil, las curvas cúbicas (como las que se encuentran en un SVG típico) son considerablemente más difíciles. El artículo entra en detalles sobre esto, pero deberá traer su sombrero de matemáticas.

La alternativa a representar curvas cúbicas es convertir las curvas cúbicas en cuadráticas. También un problema no trivial.

Una vez que puede renderizar curvas vectoriales en la GPU, es una simple cuestión de analizar el SVG en su canalización de contenido y convertirlo en una malla que pueda renderizar. Analizar SVG es fácil , por cierto.

Otra alternativa potencialmente más fácil es renunciar a todas las curvas y simplemente triangular una aproximación lineal de su SVG.

Ambas soluciones requieren triangulación: aquí hay un triangulador razonable adecuado para XNA .


Como una alternativa completamente diferente, puede usar un "campo de distancia" para representar sprites con bordes afilados casi vectoriales.

Aquí hay un documento de Valve de SIGGRAPH 2007 sobre cómo hacer esto: Mejora de la prueba alfa mejorada para texturas vectoriales y efectos especiales (PDF)

El método básico aquí es muy fácil de implementar. La dificultad surge cuando se trata de hacer que soporte esquinas afiladas (algo que solo se tocó en el papel). Este método también tiene algunas limitaciones bastante severas para cualquier cosa que no sea dibujar formas simples. Es más adecuado para calcomanías y texto de IU (como lo está usando Valve).


Ahora que he dicho todo eso, tengo que decir que, en mi experiencia, ¡todo el esfuerzo aquí no vale la pena!

A menos que su juego se base principalmente en efectos extremos de zoom vectorial como la genial demostración de Masagin , puede salirse con la representación previa de su SVG y simplemente usar técnicas de mapa de bits (más fácil, mejor compatible, etc.).

(Una de las primeras técnicas que viene a la mente es la versión de alta resolución de sus sprites mipmapping ( wiki ), para darle independencia de resolución hasta su tamaño máximo de sprite).

Esta publicación de blog es probablemente un buen lugar para comenzar a agregar soporte de representación SVG a su canal de contenido XNA.

Andrew Russell
fuente
Excelente respuesta, gracias! Esa es una cuerda más que suficiente para ahorcarme. Al final, probablemente seguiré tu consejo para ir a la ruta del mapa de bits. Mientras tanto, ¡tengo algo de lectura que hacer! : P
drxzcl
¿Esta respuesta sigue siendo precisa?
lochok
@lochok Sí. No hay nada en mi respuesta que de repente deje de funcionar. Es posible que se desarrolle una mejor manera de hacer vectores en el futuro, pero, al momento de escribir esto, no he oído hablar de nada nuevo.
Andrew Russell
Más aún, quería decir que no había una solución existente
Lochok