Хороший вопрос Я экспериментировал с этим однажды - я не мог найти простое, заранее построенное решение. Но позвольте мне указать вам на некоторые ресурсы, которые я нашел, пытаясь реализовать это самостоятельно:
Прежде всего, есть статья из GPU Gems 3: Рендеринг векторного искусства на графическом процессоре (и соответствующая статья Loop-Blinn ).
Самое сложное в том, что, хотя рисовать квадратичные кривые очень просто, кубические кривые (подобные тем, которые есть в вашем типичном SVG) значительно сложнее. В статье подробно об этом говорится, но вам нужно принести свою математическую шапку.
Альтернативой рендеринга кубических кривых является преобразование кубических кривых в квадратичные. Также нетривиальная проблема.
Как только вы сможете визуализировать векторные кривые на графическом процессоре, достаточно просто проанализировать SVG в конвейере содержимого и превратить его в сетку, которую вы можете визуализировать. Кстати, разбирать SVG легко .
Другой, потенциально более простой альтернативой является отказ от кривых все вместе и просто триангуляция линейного приближения вашего SVG.
Оба эти решения требуют триангуляции - вот разумный триангулятор, подходящий для XNA .
В качестве совершенно другой альтернативы вы можете использовать «поле расстояния» для рендеринга спрайтов с почти векторными острыми краями.
Вот документ из Valve от SIGGRAPH 2007 о том, как это сделать: Улучшенное альфа-тестирование увеличения для векторных текстур и спецэффектов (PDF)
Основной метод здесь очень прост в реализации. Трудность возникает, когда он пытается поддержать острые углы (что-то только затронуто в статье). Этот метод также имеет довольно серьезные ограничения для всего, кроме рисования простых фигур. Лучше всего подходит для текста пользовательского интерфейса и надписей (например, Valve его использует).
Теперь, когда я сказал все это - я должен сказать, что, по моему опыту, все усилия здесь не стоят того!
Если ваш игровой процесс не будет основан, в первую очередь, на экстремальных эффектах векторного масштабирования, таких как очень крутая демонстрация Masagin , вы можете избежать предварительного рендеринга SVG и просто использовать растровые методы (проще, лучше поддерживаются и т. Д.).
(Один из первых приемов, который приходит на ум, - это MipMap ( Wiki ) версии ваших спрайтов с высоким разрешением, чтобы дать вам независимость от разрешения вплоть до максимального размера спрайта.)
Этот пост , вероятно, является хорошим местом для начала добавления поддержки рендеринга SVG в ваш конвейер контента XNA.