Rendering seni SVG langsung di XNA

36

Misalkan saya memiliki banyak seni 2D dalam beberapa format vektor seperti SVG. Apakah ada cara mudah untuk merendernya secara langsung tanpa harus mengimplementasikan renderer SVG lengkap sendiri?

Tentu saja saya dapat melakukan rasterisasi secara off-line (misalnya dalam pipa konten) untuk resolusi / tingkat zoom yang berbeda, tetapi saya ingin mempertahankan visual yang tajam pada tingkat zoom terus menerus yang ditawarkan oleh grafik vektor.

drxzcl
sumber

Jawaban:

24

Pertanyaan yang bagus Saya sedang bereksperimen dengan ini pada satu titik - saya tidak dapat menemukan solusi yang mudah dan sudah dibangun sebelumnya. Tetapi izinkan saya mengarahkan Anda ke beberapa sumber yang saya temukan ketika mencoba menerapkannya sendiri:


Pertama-tama ada artikel dari GPU Permata 3: Rendering Vector Art pada GPU (dan kertas Loop-Blinn yang terkait ).

Bagian tersulit adalah bahwa, meskipun menggambar kurva kuadrat itu mudah, kurva kubik (seperti yang ditemukan di SVG khas Anda) jauh lebih sulit. Artikel ini menjelaskan secara rinci tentang ini, tetapi Anda harus membawa topi matematika Anda.

Alternatif render kurva kubik adalah mengubah kurva kubik menjadi kurva kuadrat. Juga masalah yang tidak sepele.

Setelah Anda dapat membuat kurva vektor pada GPU, itu adalah masalah sederhana untuk mem-parsing SVG dalam pipa konten Anda dan mengubahnya menjadi mesh yang dapat Anda render. Parsing SVG itu mudah .

Alternatif lain yang berpotensi lebih mudah adalah melepaskan kurva bersama-sama dan hanya melakukan triangulasi perkiraan linier SVG Anda.

Kedua solusi ini memerlukan triangulasi - inilah triangulator yang masuk akal yang cocok untuk XNA .


Sebagai alternatif yang sama sekali berbeda, Anda dapat menggunakan "bidang jarak" untuk membuat sprite dengan tepi tajam yang hampir seperti vektor.

Berikut ini adalah makalah dari Valve dari SIGGRAPH 2007 tentang cara melakukan ini: Magnifikasi Alpha-Tested yang Ditingkatkan untuk Tekstur Vektor dan Efek Khusus (PDF)

Metode dasar di sini sangat mudah diimplementasikan. Kesulitan datang ketika mencoba membuatnya mendukung sudut tajam (sesuatu yang hanya menyentuh di koran). Metode ini juga memiliki beberapa batasan yang cukup parah untuk apa pun selain menggambar bentuk sederhana. Ini paling cocok untuk teks dan decals UI (seperti yang digunakan Valve).


Sekarang saya sudah mengatakan semua itu - saya harus mengatakan bahwa, dalam pengalaman saya, semua upaya di sini tidak sepadan!

Kecuali gameplay Anda akan didasarkan terutama di sekitar efek pembesaran vektor ekstrim seperti demo Masagin yang sangat keren , Anda bisa lolos dengan pre-rendering SVG Anda dan hanya menggunakan teknik bitmap (lebih mudah, lebih baik didukung, dll).

(Salah satu teknik pertama yang terlintas dalam pikiran adalah memetakan ( wiki ) versi resolusi tinggi dari sprite Anda, untuk memberi Anda independensi resolusi hingga ukuran sprite maksimum Anda.)

Posting blog ini mungkin merupakan tempat yang baik untuk memulai menambahkan dukungan render SVG ke saluran konten XNA Anda.

Andrew Russell
sumber
Jawaban yang bagus, terima kasih! Itu jauh lebih dari cukup untuk digantung dengan tali. Pada akhirnya, saya mungkin akan mengambil saran Anda untuk pergi ke rute bitmap. Sementara itu, saya harus membaca! : P
drxzcl
Apakah jawaban ini masih akurat?
lochok
@lochok Ya. Tidak ada jawaban saya yang tiba-tiba berhenti bekerja. Mungkin saja cara vektor yang lebih baik dapat dikembangkan di masa depan - tetapi, pada saat penulisan, saya belum pernah mendengar hal baru.
Andrew Russell
Saya lebih berarti tidak ada solusi yang ada
lochok