ฉันจะเรนเดอร์กระจกหรือพื้นผิวสะท้อนแสงอื่น ๆ ได้อย่างไร?


16

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

เราจะต้องใช้รังสีหนึ่งดวงที่มาจากศูนย์กลางของกล้องดั้งเดิมเพื่อกำหนดจุดที่ศูนย์กลางของการมองเห็นอยู่บนระนาบกระจก


1
คุณต้องการที่จะมีร่าง / ภาพวาดของ "สิ่งที่ฉันหมายถึง" สิ่งนี้หรือไม่?
daemonfire300

คุณอาจลองโพสต์สิ่งนี้ที่stackoverflow.comเนื่องจากไม่เกี่ยวข้องกับการพัฒนาเกมโดยตรง อาจมีผู้เชี่ยวชาญด้านกราฟิคมากกว่านั้นที่สามารถช่วยคุณได้
Ricket

คำตอบ:


14

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

9.170 ฉันจะแสดงกระจกได้อย่างไร

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

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

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

ฉันคิดว่าถ้าคุณใช้ DirectX ขั้นตอนจะเหมือนกันมาก


3
อีกทางเลือกหนึ่งถ้าคุณมีหน่วยความจำมากกว่าเวลาในการเรนเดอร์ก็คือการสะท้อนเรขาคณิตโลกของคุณผ่านมิเรอร์ในโปรแกรมแก้ไขภาพ 3 มิติของคุณจากนั้นคุณสามารถปรับเปลี่ยนให้ดูตามที่คุณต้องการ เราทำสิ่งนี้บน PS1 ซึ่งสิ่งที่นั่งอยู่บนพื้นเงานั้นถูกทำซ้ำ / กลับหัวใต้ดินและพื้นนั้นก็กลายเป็นกึ่งโปร่งใส
dash-tom-bang

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