Kết xuất nghệ thuật SVG trực tiếp trong XNA


36

Giả sử tôi có một loạt các tác phẩm nghệ thuật 2D ở một số định dạng vector hóa như SVG. Có cách nào dễ dàng để kết xuất trực tiếp mà không cần phải tự thực hiện trình kết xuất SVG đầy đủ không?

Tất nhiên tôi có thể rasterize nó ngoại tuyến (ví dụ: trong đường ống nội dung) cho các độ phân giải / mức thu phóng khác nhau, nhưng tôi muốn duy trì hình ảnh rõ nét ở các mức thu phóng liên tục mà đồ họa vector cung cấp.

Câu trả lời:


24

Một câu hỏi hay. Tôi đã thử nghiệm điều này tại một thời điểm - tôi không thể tìm thấy một giải pháp dễ dàng, được xây dựng trước. Nhưng hãy để tôi chỉ cho bạn một số tài nguyên tôi tìm thấy khi cố gắng tự thực hiện nó:


Trước hết, có một bài viết từ GPU Gems 3: Rendering Vector Art trên GPU (và giấy Loop-Blinn liên quan ).

Phần khó nhất là, trong khi vẽ các đường cong bậc hai là dễ dàng, các đường cong hình khối (giống như các đường cong được tìm thấy trong SVG điển hình của bạn) khó hơn đáng kể. Bài viết đi sâu vào chi tiết về vấn đề này, nhưng bạn sẽ cần mang theo mũ toán học của mình.

Thay thế để kết xuất các đường cong hình khối là chuyển đổi các đường cong hình khối thành các đường cong bậc hai. Cũng là một vấn đề không hề nhỏ.

Khi bạn có thể kết xuất các đường cong vectơ trên GPU, việc phân tích SVG trong đường ống nội dung của bạn và biến nó thành một lưới mà bạn có thể kết xuất là một vấn đề đơn giản. Bằng cách này, phân tích cú pháp SVG rất dễ dàng .

Một cách khác, có khả năng thay thế dễ dàng hơn là từ bỏ các đường cong cùng nhau và chỉ đơn giản là sắp xếp một xấp xỉ tuyến tính của SVG của bạn.

Cả hai giải pháp này đều yêu cầu tam giác hóa - đây là một tam giác hợp lý phù hợp với XNA .


Là một giải pháp thay thế hoàn toàn khác, bạn có thể sử dụng "trường khoảng cách" để kết xuất các họa tiết với các cạnh sắc nét gần giống như vector.

Dưới đây là một bài viết của Valve từ SIGGRAPH 2007 về cách thực hiện điều này: Cải tiến phép thử Alpha được kiểm tra cho kết cấu vector và hiệu ứng đặc biệt (PDF)

Phương pháp cơ bản ở đây là rất dễ thực hiện. Khó khăn đến khi cố gắng làm cho nó hỗ trợ các góc nhọn (một cái gì đó chỉ chạm vào trong giấy). Phương pháp này cũng có một số hạn chế khá nghiêm trọng đối với bất cứ điều gì ngoại trừ vẽ các hình đơn giản. Nó phù hợp nhất với văn bản và đề can UI (như Valve đang sử dụng nó cho).


Bây giờ tôi đã nói tất cả những điều đó - tôi phải nói rằng, theo kinh nghiệm của tôi, tất cả nỗ lực ở đây là không xứng đáng!

Trừ khi lối chơi của bạn chủ yếu dựa trên các hiệu ứng thu phóng vectơ cực lớn như bản demo Masagin rất hay , bạn có thể thoát khỏi việc kết xuất lại SVG của mình và chỉ cần sử dụng các kỹ thuật bitmap (dễ dàng hơn, được hỗ trợ tốt hơn, v.v.).

(Một trong những kỹ thuật đầu tiên xuất hiện trong tâm trí là các phiên bản độ phân giải cao ( wiki ) mipmapping ( wiki ), để cung cấp cho bạn độ phân giải độc lập cho đến khi kích thước sprite tối đa của bạn.)

Bài đăng trên blog này có lẽ là một nơi tốt để bắt đầu thêm hỗ trợ kết xuất SVG vào đường dẫn nội dung XNA của bạn.


Câu trả lời tuyệt vời, cảm ơn bạn! Đó là cách quá đủ để treo mình. Cuối cùng, tôi có thể sẽ đưa lời khuyên của bạn để đi theo lộ trình bitmap. Trong khi đó, tôi có một số việc phải làm! : P
drxzcl

Câu trả lời này có còn chính xác không?
lochok

@lochok Vâng. Không có gì trong câu trả lời của tôi sẽ đột nhiên ngừng hoạt động. Có thể là một cách tốt hơn để làm vectơ có thể được phát triển trong tương lai - nhưng, tại thời điểm viết, tôi chưa nghe thấy gì mới.
Andrew Russell

Tôi có nghĩa là không có giải pháp hiện có
lochok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.