วิธีสร้าง shader พิกเซลแบบ "ย้อนยุค" สำหรับสไปรต์ 2D แบบเปลี่ยนรูปซึ่งรักษาความเที่ยงตรงของพิกเซลได้อย่างไร


10

ภาพด้านล่างแสดงสไปรต์สองรายการที่มีการสุ่มตัวอย่างแบบจุดบนพื้นหลัง:

ป้อนคำอธิบายรูปภาพที่นี่

  • กะโหลกศีรษะด้านซ้ายไม่มีการหมุน / การปรับสเกลดังนั้นทุกพิกเซลจึงเข้ากันกับพื้นหลังอย่างสมบูรณ์
  • กะโหลกศีรษะด้านขวาจะหมุน / ปรับขนาดและผลในพิกเซลขนาดใหญ่ที่ไม่ได้แกนชิด

ฉันจะพัฒนาตัวสร้างพิกเซลที่จะแสดงสไปรต์ที่ถูกแปลงทางด้านขวาด้วยพิกเซลที่จัดเรียงตามแนวแกนที่มีขนาดเท่ากับส่วนที่เหลือของฉากได้อย่างไร

สิ่งนี้อาจเกี่ยวข้องกับวิธีการนำสไปรต์สเกลมาใช้ในเกมเก่า ๆ เช่น Monkey Island เพราะนั่นเป็นเอฟเฟกต์ที่ฉันพยายามจะทำ แต่มีการเพิ่มการหมุน


แก้ไข

ตามคำแนะนำของ kaoD ฉันพยายามที่จะแก้ไขปัญหาว่าเป็นกระบวนการหลังการขาย วิธีที่ง่ายที่สุดคือการเรนเดอร์ไปยังเป้าหมายการเรนเดอร์แยกต่างหากก่อน (ลดขนาดลงเพื่อให้ตรงกับขนาดพิกเซลที่ต้องการ) จากนั้นเพิ่มขนาดเมื่อทำการเรนเดอร์ครั้งที่สอง มันตอบสนองความต้องการของฉันด้านบน

ครั้งแรกที่ฉันลองทำมันLinear -> Pointและผลลัพธ์ก็คือ:

ป้อนคำอธิบายรูปภาพที่นี่

ไม่มีการบิดเบือน แต่ผลลัพธ์ดูเบลอและเสียสีส่วนใหญ่ไป ในความคิดของฉันมันแบ่งดูย้อนยุคที่ฉันต้องการ

ครั้งที่สองที่ฉันลองPoint -> Pointและผลลัพธ์คือ:

ป้อนคำอธิบายรูปภาพที่นี่

แม้จะมีการบิดเบือน แต่ฉันคิดว่ามันอาจจะดีพอสำหรับความต้องการของฉันถึงแม้ว่ามันจะดูดีกว่าในรูปภาพนิ่งมากกว่าในการเคลื่อนไหว

ในการสาธิตนี่เป็นวิดีโอของเอฟเฟกต์ถึงแม้ว่า YouTube จะกรองพิกเซลออกจากมัน:

http://youtu.be/hqokk58KFmI

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


นั่นควรจะเป็นหัวกระโหลก ... ?
DeadMG

@DeadMG ฉันจะเดาได้ไหม?
David Gouveia

ผลดีดูดีกว่าที่ฉันคิดว่ามันจะดู (ฉันลองมันในความละเอียดต่ำสุดและจานสี 40x30 EGA.) นั่นคือรูปลักษณ์ที่คุณจะสร้าง postfx shader ของคุณเอง BTW ฉันสงสัยว่าจะมีวิธีการสุ่มตัวอย่างที่ดีกว่าซึ่งจะรักษาผลตามที่คุณตั้งใจไว้ NN เป็นสิ่งที่ให้ภาพที่คมชัดมาก ๆ การสุ่มตัวอย่างอื่น ๆ จะทำให้ภาพสุดท้ายเบลอ (เพียงแค่เดาอะไรเลย)
kaoD

@kaoD แต่จำไว้ว่าฉันสมัครสองรอบ รอบที่สองที่ยกตัวอย่างภาพยังคงเป็นเพื่อนบ้านที่ใกล้ที่สุดเพื่อรักษาความรู้สึกย้อนยุค แต่ฉันคิดว่าอาจมีประโยชน์ในการลองใช้เทคนิคการสุ่มตัวอย่างที่แตกต่างกันในรอบแรก ฉันกำลังดูใน Scale2x!
David Gouveia

@ kaoD Nah ฉันยอมแพ้ การเปลี่ยนพารามิเตอร์ shader ระหว่างการเรียกแต่ละสไปรต์ด้วยSpriteBatchต้องให้ฉันใช้โหมดทันทีดังนั้นจึงไม่คุ้มค่ากับปัญหา ฉันจะไปกับสิ่งนี้ :)
David Gouveia

คำตอบ:


3

คุณควรใช้ shader หลังจากสไปรต์ของคุณถูกหมุน

หากทั้งฉากยังไม่ได้ถูกบังและสไปรท์ของคุณเป็นพิกเซลจริง ๆ สิ่งที่คุณต้องการคือฟิลเตอร์ post-FX บางชนิดสำหรับฉากทั้งหมดของคุณ พื้นที่เฉลี่ยของพิกเซลจะใช้งานได้ดี มันไม่ได้เป็นอย่างที่คุณตั้งใจ (มันจะดูใจดีเมื่อย้าย / หมุน) แต่มันอาจทำเคล็ดลับ

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

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


ใช่ฉันยังไม่ได้ใช้เฉดสีใด ๆ มันเป็นเพียงสไปรต์ปกติที่มีพื้นผิวที่มีความละเอียดต่ำมากแสดงผลด้วยค่าเริ่มต้นของ XNA SpriteBatchเมื่อเปิดการสุ่มจุด แต่โพสต์ fx อาจได้ผลจริง สำหรับผู้เริ่มฉันจะลองเรนเดอร์ด้วยการสุ่มตัวอย่างเชิงเส้นไปยังเป้าหมายการเรนเดอร์จากนั้นเรนเดอร์เป้าหมายการเรนเดอร์ทั้งหมดไปที่ backbuffer
David Gouveia

@DavidGouveia อย่าพลาดโอกาสในการอัพเกรดความละเอียดของคุณ ถ้าคุณต้องการให้ได้เอฟเฟกต์ดั้งเดิมมันเป็นช็อตที่ดีที่สุดของคุณ หากคุณต้องการความละเอียดสูง (หากส่วนหนึ่งของ GFX ของคุณเป็นความละเอียดสูงหรือคุณต้องการจับคู่ความละเอียดดั้งเดิม) คุณยังสามารถแสดงผลเป็นบัฟเฟอร์หน้าจอความละเอียดต่ำแล้วทาสีลงใน framebuffer ความละเอียดสูงของคุณแบบเต็ม รูปสี่เหลี่ยมหน้าจอพร้อมการกรองปิดอยู่ โปรดทราบว่าคุณต้องจับคู่อัตราส่วนภาพเพื่อหลีกเลี่ยงพิกเซลสี่เหลี่ยมแน่นอน
kaoD

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