การแสดงผล SVG โดยตรงใน XNA


36

สมมติว่าฉันมีงานศิลปะสองมิติในรูปแบบเวกเตอร์บางรูปแบบเช่น SVG มีวิธีง่าย ๆ ในการแสดงผลโดยตรงโดยไม่ต้องใช้ตัวแสดง SVG แบบเต็มหรือไม่

แน่นอนว่าฉันสามารถ rasterize แบบออฟไลน์ (เช่นในส่วนเนื้อหา) สำหรับความละเอียด / ระดับการซูมที่แตกต่างกัน แต่ฉันต้องการคงภาพที่คมชัดในระดับการซูมต่อเนื่องที่กราฟิกเวกเตอร์เสนอ

คำตอบ:


24

เป็นคำถามที่ดี ฉันกำลังทดลองกับสิ่งนี้ในจุดหนึ่ง - ฉันไม่สามารถหาวิธีแก้ปัญหาที่ง่ายและสร้างไว้ล่วงหน้าได้ แต่ให้ฉันแนะนำคุณไปยังแหล่งข้อมูลที่ฉันพบเมื่อพยายามใช้มันด้วยตนเอง:


ก่อนอื่นมีบทความจาก GPU Gems 3: Rendering Vector Art บน GPU (และกระดาษ Loop-Blinn ที่เกี่ยวข้อง)

ส่วนที่ยากที่สุดคือในขณะที่การวาดเส้นโค้งกำลังสองนั้นง่ายลูกบาศก์โค้ง (เช่นที่พบใน SVG ทั่วไปของคุณ) นั้นหนักกว่ามาก บทความมีรายละเอียดเกี่ยวกับเรื่องนี้ แต่คุณจะต้องนำหมวกคณิตศาสตร์ของคุณ

ทางเลือกในการเรนเดอร์ลูกบาศก์โค้งคือการแปลงลูกบาศก์โค้งเป็นกำลังสอง ยังเป็นปัญหาที่ไม่น่ารำคาญ

เมื่อคุณสามารถเรนเดอร์เวกเตอร์โค้งบน GPU มันเป็นเรื่องง่าย ๆ ในการแยกวิเคราะห์ SVG ในขั้นตอนการผลิตเนื้อหาของคุณและเปลี่ยนเป็นตาข่ายที่คุณสามารถแสดงผลได้ การแยกวิเคราะห์ SVG นั้นง่ายมาก

ทางเลือกอื่นที่อาจจะง่ายกว่าคือการนำเส้นโค้งทั้งหมดมารวมกันและเพียงสามเหลี่ยมการประมาณเชิงเส้นของ SVG ของคุณ

ทั้งสองวิธีการเหล่านี้จำเป็นต้องมีรูปสามเหลี่ยม - นี่เป็น triangulator เหมาะสมเหมาะกับ XNA


เป็นทางเลือกที่แตกต่างอย่างสิ้นเชิงคุณสามารถใช้ "ระยะทางไกล" เพื่อแสดงสไปรต์ที่มีขอบคมเกือบเหมือนเวกเตอร์

นี่คือกระดาษจาก Valve จาก SIGGRAPH 2007 เกี่ยวกับวิธีการทำเช่นนี้: การปรับปรุงอัลฟาที่ได้รับการปรับปรุงสำหรับพื้นผิวแบบเวกเตอร์และเทคนิคพิเศษ (PDF)

วิธีการพื้นฐานที่นี่ใช้งานง่ายมาก ความยากลำบากเกิดขึ้นเมื่อพยายามทำให้มุมคมชัด (มีเพียงสิ่งเดียวที่สัมผัสกับกระดาษ) วิธีนี้ยังมีข้อ จำกัด ที่ค่อนข้างรุนแรงสำหรับทุกอย่างยกเว้นการวาดรูปร่างอย่างง่าย เหมาะที่สุดสำหรับข้อความ UI และสติ๊กเกอร์ (เช่น Valve ใช้สำหรับ)


ตอนนี้ฉันได้พูดทั้งหมดแล้ว - ฉันต้องบอกว่าจากประสบการณ์ของฉันความพยายามทั้งหมดที่นี่ไม่คุ้มค่า!

ยกเว้นว่าการเล่นเกมของคุณจะขึ้นอยู่กับเอฟเฟกต์การซูมเวกเตอร์สุดขีดเช่นการสาธิตMasagin ที่ยอดเยี่ยมมากคุณสามารถหลีกเลี่ยงการแสดงผล SVG ของคุณล่วงหน้าและใช้เทคนิคบิตแมป (ง่ายกว่าสนับสนุนที่ดีกว่า ฯลฯ )

(หนึ่งในเทคนิคแรกที่นึกถึงคือmipmapping ( wiki ) เวอร์ชันความละเอียดสูงของสไปรท์ของคุณเพื่อให้คุณสามารถแยกแยะความละเอียดได้จนถึงระดับสไปรต์สูงสุดของคุณ)

โพสต์บล็อกนี้น่าจะเป็นจุดเริ่มต้นที่ดีในการเริ่มเพิ่มการสนับสนุนการเรนเดอร์ SVG ให้กับ XNA content ของคุณ


คำตอบที่ยอดเยี่ยมขอบคุณ! นั่นเป็นวิธีที่มากกว่าเชือกพอที่จะแขวนตัวเองด้วย ในที่สุดฉันอาจจะใช้คำแนะนำของคุณเพื่อไปเส้นทางบิตแมป ในระหว่างนี้ฉันได้อ่านให้ทำ! : P
drxzcl

คำตอบนี้ยังคงถูกต้องหรือไม่?
lochok

@lochok ใช่ ไม่มีอะไรในคำตอบของฉันที่จะหยุดทำงานทันที มีความเป็นไปได้ที่วิธีที่ดีกว่าในการทำเวกเตอร์อาจถูกพัฒนาขึ้นในอนาคต - ในขณะที่เขียนฉันไม่ได้ได้ยินอะไรใหม่
Andrew Russell

ฉัน moreso หมายความว่าไม่มีวิธีแก้ปัญหาที่มีอยู่แล้ว
lochok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.