Відображення SVG-мистецтва безпосередньо в XNA


36

Припустимо, я маю купу двовимірного мистецтва в якомусь векторному форматі, наприклад, SVG. Чи є простий спосіб зробити це безпосередньо, без того, щоб сам реалізувати повний SVG-рендер?

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

Відповіді:


24

Гарне запитання. Я експериментував з цим в один момент - я не міг знайти простого, заздалегідь побудованого рішення. Але дозвольте вказати на деякі з ресурсів, які я знайшов, намагаючись реалізувати його сам:


Перш за все є стаття від GPU Gems 3: Візуалізація векторного мистецтва на графічному процесорі (та пов'язаній з ним папері Loop-Blinn ).

Найскладніше в тому, що, хоча малювати квадратичні криві легко, кубічні криві (як ті, що знайдені у вашому типовому SVG) значно складніше. У цій статті детально йдеться про це, але вам потрібно буде взяти шапку з математики.

Альтернативою кубічних кривих є перетворення кубічних кривих у квадратичні. Також нетривіальна проблема.

Після того, як ви можете надати векторні криві на графічному процесорі, це простий аналіз розбору SVG у контентному конвеєрі та перетворення його в сітку, яку ви можете візуалізувати. Розбирати SVG легко , до речі.

Інша, потенційно простіша альтернатива - відмовитися від кривих всіх разом і просто тріангулювати лінійне наближення вашого SVG.

Обидва ці рішення потребують тріангуляції - ось розумний триангулятор, придатний для XNA .


Як зовсім інша альтернатива, ви можете використовувати "поле відстані" для візуалізації спрайтів з майже векторними гострими краями.

Ось стаття з Valve з SIGGRAPH 2007 про те, як це зробити: Покращене вимірювання альфа-тестуванням для векторних текстур та спеціальних ефектів (PDF)

Основний метод тут дуже простий у здійсненні. Складність виникає при спробі змусити її підтримувати гострі кути (щось лише торкається в папері). Цей метод також має досить суворі обмеження для будь-якого, крім малювання простих фігур. Він найкраще підходить для тексту інтерфейсу та ярликів (як Valve використовує його для).


Тепер, коли я все це сказав - мушу сказати, що, зі свого досвіду, всіх зусиль тут не варто!

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

(Однією з перших методик, яка приходить в голову, є міпмапінг ( wiki ) версії з високою роздільною здатністю ваших спрайтів, щоб надати вам незалежність роздільної здатності до максимального розміру спрайту.)

Ця публікація в блозі , мабуть, є хорошим місцем для початку роботи над додаванням SVG-рендерінгу у ваш конвеєр вмісту XNA.


Відмінна відповідь, дякую! Тобто більш ніж достатньо мотузки, щоб повісити себе. Врешті-решт, я, мабуть, візьму вашу пораду пройти растровий маршрут. Тим часом я щось читаю! : P
drxzcl

Ця відповідь все-таки точна?
лочок

@lochok Так. У моїй відповіді немає нічого, що раптом перестане працювати. Цілком можливо, що в майбутньому може бути розроблений кращий спосіб здійснення векторів, але я, на момент написання, не чув нічого нового.
Ендрю Рассел

Я ще мав на увазі, що не існує рішення
lochok
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.