Display Resolution Independent 2D Display Subsystem — with 3D

วันนี้จะเป็นอีกวันที่จะพูดร่ายยาวโดยที่ไม่มีโค๊ด 😛

เมื่อก่อน สัก 7-8 ปีที่แล้ว ในขณะนั้นจอ CRT ยังคงได้รับความนิยม เวลาเล่นเกม 2D เวลาเข้าโหมด Full Screen เกมจะทำการเปลี่ยนความละเอียดของหน่วยแสดงผลให้เป็นความละเอียดที่เกมเราใช้ ซึ่งจอ CRT นั้นสามารถรองรับความละเอียดของหน่วยแสดงผลได้หลากหลาย (อันเนื่องมาจากกลไกการแสดงผล)

มาในวันนี้ วันที่พวกเราใช้จอ LCD สุดหรู คนเขียนเกม 2D จะประสพปัญหาปวดหัวมากมาย ดังนี้

  1. ความละเอียดของจอ LCD ที่จะตายตัวเสมอ ถึงแม้ว่าเกมเราจะเปลี่ยนความละเอียดให้ต่ำกว่าได้ แต่ Output ที่ได้จะไม่สามารถคาดเดาได้ (และมักจะแย่เสมออย่างไม่ทราบสาเหตุ) เช่น อาจจะแสดงผลไม่เต็มจอ อาจจะแสดงผลเต็มจอแต่ภาพดูแย่ หรือแม้กระทั่งไม่สามารถให้ความละเอียดนี้ได้เลย
  2. Aspect Ratio ที่แตกต่างกันในแต่ละจอ ทุกวันนี้ นอกจาก 4:3 แล้ว เรามี 5:4, 16:9, 16:10, และอื่น ๆ อีก … ถ้าเกิดความละเอียดที่เราใช้มันมี Ratio ที่แตกต่างกับจอ ภาพที่ได้ อาจะยืด อาจจะมีขอบดำ หรือไม่สามารถแสดงผลได้เลยก็ได้

ทีนี้เรารู้อยู่แล้วว่าการใช้จอ LCD นั้นสร้างปัญหาให้กับเรานักพัฒนา และ การบังคับให้กลับไปใช้จอ CRT นั้นเป็นเรื่องเป็นไปไม่ได้ เราก็ต้องเลือกที่จะอยู่กับมันโดยที่อย่างน้อยเราสามารถกำหนดพฤติกรรมของโปรแกรมเมื่อความละเอียดที่เราจะใช้แตกต่างจากความละเอียดของจอ

วิธีการจริง ๆ ก็ง่าย ๆ แต่บอกก่อนว่ากินแรงเครื่องระดับนึง … ก็คือ … ใช้ Feature ของ API 3D ที่เรียกว่า Render-To-Texture หรือ Render-To-Surface โดยสร้าง Surface ขนาดตายตัวเท่ากับ Resolution ของเกมเรา เวลาเราจะวาดอะไรเราก็จะวาดลงบน Surface อันนี้ แล้วจากนั้นก็วาด Surface นี้ขึ้นบนจออีกต่อนึง …

เวลาที่วาด Surface นี้ขึ้นบนจอ เราสามารถกำหนดพฤติกรรมบางอย่างได้ เช่น กำหนดให้ขนาดของ Surface บนจอนั้นถูกยืดให้พอดีกับขอบจอโดยไม่ให้เสีย Aspect Ratio กำหนดวิธีการยืดภาพ (เช่น Bilinear, Trilinear) เป็นต้น เพื่อที่เราจะสามารถควบคุมว่าคุณภาพของภาพจะดีหรือแย่อย่างไร แทนที่จปล่อยให้ตัวจอเป็นตัวจัดการ

ข้อเสียหลัก ๆ คือ Performance น่ะล่ะครับ …

ลองเล่นดูนะ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

This site uses Akismet to reduce spam. Learn how your comment data is processed.