การฉายเงาแบบเรียลไทม์ในเกม 2D สามมิติ


15

ฉันเขียนเอนจิ้น isometric 2d ขนาดเล็กใน C ++ และฉันพยายามที่จะใช้การจำลองเงาแบบเรียลไทม์ ฉันทำตามวิธีง่าย ๆ ที่อธิบายไว้ในหน้านี้และนี่คือผลลัพธ์ (แสงอยู่ที่ตำแหน่งเดียวกันกับลูกบาศก์สีเหลือง):

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

ผลลัพธ์เป็นสิ่งที่ดีมาก แต่มีเงาที่หายไปบนผนังและด้านบนของก้อน นี่คือตัวอย่างว่าควรมีลักษณะอย่างไร (ฉันวาดเงาที่คาดไว้เป็นสีเขียว):

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

ก้อนทั้งหมดที่ถูกดึงออกมานั้นทำจาก 3 มิติสี่มิติที่อยู่ในตำแหน่ง XY และมีความลึก Z (z = x + y) ฉันใช้ OpenGL กับ orthographic matrix (glOrtho) เงาถูกวาดโดยใช้ stencil buffer

ฉันกำลังมองหาแหล่งข้อมูลหรือโซลูชันที่จะช่วยให้ฉันใช้งานการจำลองเงานี้

ขอบคุณมาก!


5
ลิงก์ไปยัง "หน้านี้" ของคุณชี้ไปที่รูปภาพไม่ใช่หน้าเว็บ นอกจากนี้ฉันแค่เดาที่นี่ แต่มันอาจจะง่ายกว่าที่จะแก้ปัญหาในแบบ 3 มิติและฉายภาพกล้องแบบไม่สมมาตร
Tetrad

โอ้คุณพูดถูกฉันแก้ไขลิงก์แล้ว แน่นอนว่ามันจะง่ายขึ้นด้วยการฉายภาพ 3 มิติ แต่ 2D มีข้อได้เปรียบเช่นกัน
XPac27

คำตอบ:


6

สำหรับหลังคาและผนังคุณอาจลองกำหนดจุดตัดระหว่างส่วนผนังกับภูมิภาคที่สร้างเงา คุณต้องแสดงเงาสองครั้ง คนแรกจะทำสิ่งที่คุณกำลังทำวันนี้ (ในการจัดเก็บหน่วยความจำ) รอบที่สองจะคำนวณจุดตัดของหลังคาและผนัง ขั้นตอนสุดท้ายคือการเรนเดอร์จริง DeadMG นั้นผิดคุณสามารถทำได้

หมายเหตุ: สำหรับหลังคาคุณต้องตัดกันบริเวณเงาและพื้นที่หลังคา


ขอบคุณสำหรับคำแนะนำที่ดี! หากอาจสามารถเพิ่มประสิทธิภาพการผ่านรอบที่สองนี้ได้โดยการตรวจสอบผนังที่ควรคำนวณโดยใช้ผลิตภัณฑ์ดอทของกลุ่มของพวกเขาเปรียบเทียบกับกลุ่มส่วนเงา ฉันจะลองและโพสต์กลับถ้ามันใช้งานได้
XPac27

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

@ XPac27 นั้นช่างยอดเยี่ยม ขอบคุณสำหรับการแบ่งปัน.
ashes999

0

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


1
แต่นั่นไม่ใช่การฉายเงาแบบ 3 มิติในคำถาม ผนังใด ๆ กั้นเส้นสายตาในทิศทางนั้นอย่างสมบูรณ์คุณจะไม่มีวัตถุที่มีความสูงแปรผัน
yuriks

0

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


0

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

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

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

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