Рендеринг SVG-искусства прямо в XNA

36

Предположим, у меня есть набор 2D-графики в каком-то векторизованном формате, например SVG. Есть ли простой способ сделать это напрямую, не выполняя сам полный рендеринг SVG?

Конечно, я мог бы растеризовать его в автономном режиме (например, в конвейере контента) для разных разрешений / уровней масштабирования, но я бы хотел сохранить четкие изображения с непрерывными уровнями масштабирования, которые предлагает векторная графика.

drxzcl
источник

Ответы:

24

Хороший вопрос Я экспериментировал с этим однажды - я не мог найти простое, заранее построенное решение. Но позвольте мне указать вам на некоторые ресурсы, которые я нашел, пытаясь реализовать это самостоятельно:


Прежде всего, есть статья из GPU Gems 3: Рендеринг векторного искусства на графическом процессоре (и соответствующая статья Loop-Blinn ).

Самое сложное в том, что, хотя рисовать квадратичные кривые очень просто, кубические кривые (подобные тем, которые есть в вашем типичном SVG) значительно сложнее. В статье подробно об этом говорится, но вам нужно принести свою математическую шапку.

Альтернативой рендеринга кубических кривых является преобразование кубических кривых в квадратичные. Также нетривиальная проблема.

Как только вы сможете визуализировать векторные кривые на графическом процессоре, достаточно просто проанализировать SVG в конвейере содержимого и превратить его в сетку, которую вы можете визуализировать. Кстати, разбирать SVG легко .

Другой, потенциально более простой альтернативой является отказ от кривых все вместе и просто триангуляция линейного приближения вашего SVG.

Оба эти решения требуют триангуляции - вот разумный триангулятор, подходящий для XNA .


В качестве совершенно другой альтернативы вы можете использовать «поле расстояния» для рендеринга спрайтов с почти векторными острыми краями.

Вот документ из Valve от SIGGRAPH 2007 о том, как это сделать: Улучшенное альфа-тестирование увеличения для векторных текстур и спецэффектов (PDF)

Основной метод здесь очень прост в реализации. Трудность возникает, когда он пытается поддержать острые углы (что-то только затронуто в статье). Этот метод также имеет довольно серьезные ограничения для всего, кроме рисования простых фигур. Лучше всего подходит для текста пользовательского интерфейса и надписей (например, Valve его использует).


Теперь, когда я сказал все это - я должен сказать, что, по моему опыту, все усилия здесь не стоят того!

Если ваш игровой процесс не будет основан, в первую очередь, на экстремальных эффектах векторного масштабирования, таких как очень крутая демонстрация Masagin , вы можете избежать предварительного рендеринга SVG и просто использовать растровые методы (проще, лучше поддерживаются и т. Д.).

(Один из первых приемов, который приходит на ум, - это MipMap ( Wiki ) версии ваших спрайтов с высоким разрешением, чтобы дать вам независимость от разрешения вплоть до максимального размера спрайта.)

Этот пост , вероятно, является хорошим местом для начала добавления поддержки рендеринга SVG в ваш конвейер контента XNA.

Эндрю Рассел
источник
Отличный ответ, спасибо! Этого пути более чем достаточно, чтобы повеситься. В конце концов, я, возможно, воспользуюсь вашим советом, чтобы выбрать растровый маршрут. А пока у меня есть кое-что почитать! : P
drxzcl
Этот ответ все еще точен?
lochok
@ lochok Да. В моем ответе нет ничего, что вдруг перестало бы работать. Возможно, что в будущем будет разработан лучший способ создания векторов, но на момент написания статьи я не слышал ничего нового.
Эндрю Рассел
Я также имел в виду отсутствие существующего решения
lochok