การแสดงผลความละเอียดข้อความอิสระ


11

ฉันต้องการวิธีการวาดความละเอียดข้อความอิสระในเกมของฉัน นั่นคือฉันต้องสามารถซูมเข้าข้อความและไม่เคยเห็นสิ่งประดิษฐ์พิกเซล

ใครสามารถให้คำแนะนำเกี่ยวกับวิธีที่ฉันสามารถไปเกี่ยวกับเรื่องนี้?


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

คำตอบ:


7

มีสามวิธีทั่วไปในการทำ มันไม่เกี่ยวกับการกำจัดสิ่งประดิษฐ์ทั้งหมด - ซึ่งเป็นไปไม่ได้เว้นแต่คุณจะมีหน่วยความจำไม่ จำกัด หรือเวลาตัวประมวลผล - แต่จะย่อขนาดลงในวิธีที่เหมาะกับโค้ดและแพลตฟอร์มเป้าหมายที่มีอยู่ของคุณ

ก่อนอื่นเพียงใช้ rasterizer แบบอักษรของคุณ - โดยปกติแล้ว FreeType - เพื่อ rasterize แบบอักษรตามขนาดที่คุณต้องการในขณะที่คุณซูมเข้าสิ่งนี้จะดูดีในหน้าจอ แต่มันช้ามากอย่างไม่น่าเชื่อ คุณสามารถแก้ไขความเชื่องช้าโดยการแคชขนาด แต่ก็จะกลายเป็นหิวหน่วยความจำอย่างไม่น่าเชื่อ นอกจากนี้ยังไม่ได้ดูดีในการเคลื่อนไหวเพราะทำให้ร่ายมนตร์ดูดีสำหรับการแสดงผลแบบคงที่ต้องปรับขนาดพวกเขาไม่สม่ำเสมอ ยังเป็นตัวเลือกถ้าคุณอยู่บนแพลตฟอร์มที่มีหน่วยความจำเพียงพอ (เช่นพีซี) และเครื่องชั่งของคุณจะถูก จำกัด ขอบเขตไว้ที่ช่วงเล็ก ๆ เช่น 10px ถึง 30px วิธีนี้ยังไม่ได้รับการยอมรับจากคนรอบข้างด้วยตัวเอง

ประการที่สองคุณสามารถเก็บข้อความของคุณเป็นตาข่าย ห้องสมุดบางแห่งมีการทำเช่นนี้เช่น GLTTหรือคุณสามารถเขียนของคุณเอง ตอนนี้คุณไม่ได้มีสิ่งประดิษฐ์พิกเซลอีกต่อไป แต่คุณจะมีสิ่งประดิษฐ์รูปหลายเหลี่ยมถ้าคุณซูมเข้าใกล้มาก - เช่นเดียวกับที่อื่น ๆ ตาข่ายในเกม 3D ข้อความตาข่ายยอมรับว่ามีอาหารตาเป็นจำนวนมากเนื่องจากสามารถใช้เครื่องเคลือบปลายยอดได้และตาข่ายสามารถใช้ร่วมกับการวาดภาพโลกอื่น ๆ ที่คุณทำ มันเบาพอสำหรับหน่วยความจำและ CPU และง่ายต่อการวัดค่าใช้จ่ายเพราะมันเป็นเพียงตาข่ายมาตรฐาน มันอาจเป็นความเจ็บปวดที่จะรวมเข้ากับไปป์ไลน์เรนเดอร์ 2D ตามปกติ

ประการที่สามคุณสามารถใช้ฟิลด์ระยะทางร่วมกับตัวปรับพิกเซลได้ นี่เป็นเทคนิคที่ค่อนข้างใหม่ที่กำลังได้รับความนิยมโดยใช้ shader ง่าย ๆ ในการลองตัวอย่างพื้นผิวที่ทำไว้ล่วงหน้าและการกรอง bilinear "ฟรี" บนการ์ดวิดีโอของคุณเพื่อเพิ่มระดับ glyphs ให้หมดจด มันใช้หน่วยความจำน้อยและคาดเดาได้ง่ายเมื่อเทียบกับวิธีอื่น - พื้นผิว 0.5MB ถึง 1MB ต่อชุดอักขระต่อตัวอักษร มันเหมาะอย่างยิ่งกับท่อส่งเรนเดอร์เรนเดอร์เพราะมันใช้สไปรต์ สัญลักษณ์แต่ละตัวยังคงเป็นรูปสี่เหลี่ยมพื้นผิว มันสร้างสิ่งประดิษฐ์พิกเซล แต่น้อยมากเมื่อเทียบกับวิธีอื่น ๆ ที่ปรับขนาดพื้นผิว นอกจากนี้ยังมีฟังก์ชั่นทางเลือกคงที่หากตัวแบ่งพิกเซลไม่พร้อมใช้งาน แต่ข้อความลงท้ายด้วย aliased มาก เนื่องจากการสุ่มตัวอย่างทำได้ในพิกเซลเชดเดอร์มันจึงยอมรับว่ามี eye eye บางอย่างเช่นเค้าร่างและเงาสำหรับราคาถูก


3

นอกจากนี้ยังมีการวิจัย บทความจาก Microsoft Research โดย Loop และ Blinn เกี่ยวกับการแสดงผลเส้นโค้งความละเอียดอิสระโดยใช้เฉดสี มันแนะนำให้ใช้เทคนิคที่นำเสนอเพื่อแสดงข้อความ TrueType ในแบบอิสระความละเอียด


1

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

โชคดีที่แบบอักษรส่วนใหญ่สร้างขึ้นจากเส้นโค้งเบซิเยร์แล้ว ในการรับข้อมูลโค้งคุณต้องใช้ Windows มาตรฐานฟังก์ชัน GetGlyphOutline ()เพื่อแยกข้อมูล

ฉันไม่แน่ใจว่าคุณจะได้รับข้อมูลโค้งจาก C # โดยไม่ต้อง PInvoke


1
เพื่อที่จะทำให้ข้ามแพลตฟอร์มนี้และไม่ต้องกังวลกับสิ่ง PInvoke ดูเหมือนว่าคุณจะสามารถเขียนเครื่องมือเพื่อถ่ายโอนข้อมูลที่ GetGlyphOutline อ่าน (ดูคำถาม SO นี้ ) ในรูปแบบที่กำหนดเองแล้วมี ไฟล์ I / O ที่เรียบง่ายบางอย่างในรหัสเกมเพื่อโหลดข้อมูล glyph ที่จัดเก็บแบบกำหนดเองของคุณ
Ricket

0

คุณอาจต้องการดูฟรีสไตล์ ฉันไม่รู้ว่ามันมีอยู่ในแพลตฟอร์มของคุณหรือถ้ามีใบอนุญาต แต่มันเป็นโอเพ่นซอร์สไลบรารี่ที่ยอดเยี่ยมสำหรับการแสดงผลแบบอักษรจริงและแบบอักษรเวกเตอร์อื่น ๆ ฉันเชื่อว่าพวกเขาต้องทำทนายที่ฉลาดบางคนหลบรหัสเพื่อให้ได้แบบอักษรเพื่อแสดงผลอย่างสวยงาม วิธีการพิมพ์ที่แท้จริงเกี่ยวข้องกับรหัสไบต์บนเส้นโค้งเพื่อให้คำแนะนำแก่ตัวแสดงผลเพื่อไม่ให้คุณลักษณะแบบอักษรที่สำคัญ (เช่นแนวดิ่งและแนวตั้ง) ไม่เบลอเช่นที่พวกเขาใช้การลบรอยหยักแบบไร้เดียงสามาตรฐาน เทคนิคนั้นมีการจดสิทธิบัตรไว้ดังนั้นคนที่เป็นอิสระจึงต้องหาวิธีอื่นในการทำงานและไม่ได้เรียกสัตว์ร้ายที่น่ากลัวของ Apple (ฉันคิดว่า) อย่างไรก็ตามลองคิดดูในแบบอิสระ ๆ ดูสิhttp://freetype.sourceforge.net/index2.html

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