แสงสว่างในโลก Minecraftian


10

Minecraft เป็นเกมที่มีพื้นฐานมาจากความสูงและใช้ข้อมูล heigtmap เพื่อทำให้โลกสว่าง จากความเข้าใจของฉันจุดสูงสุดในแผนผังความสูงคือจุดสิ้นสุดของพื้นที่ที่ได้รับผลกระทบจากแสงแดด ทุกสิ่งที่อยู่ด้านบนนั้นสว่างไสวด้วยแสงแดดทุกอย่างด้านล่างที่เพิ่งได้รับอิทธิพลจากแสงใกล้เคียงในรัศมี 8 ช่วงตึก

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

ทั้งสองวิธีมีปัญหาสองสามอย่างเกี่ยวกับรูปแบบการจัดแสง minecrafts: อย่างแรกเลยถ้าโลกของคุณไม่มีแผนผังความสูงมันจะยากกว่าที่จะคิดออกว่าควรจะปล่อยแสงแดดออกมาอย่างไร วิธีง่าย ๆ คือสมมติว่าโลกนี้ (ในกรณีของฉัน) เป็นหินลอยและจากนั้นสำรวจแต่ละแกนจากทั้งสองทิศทางและหาจุดที่หินเริ่มต้นและสิ้นสุด แต่สิ่งนี้ไม่ได้ขจัดปัญหาอย่างเต็มที่เนื่องจากรอยบุบในหินไม่ควรอยู่ในความมืด

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

จากความเข้าใจที่ จำกัด ของฉันเกี่ยวกับแสงกราฟิก 3D โลกอย่าง Minecraft ไม่ควรเป็นปัญหาที่ใหญ่ที่สุด คุณจะจัดการกับปัญหาอย่างไร

ฉันคิดว่าข้อกำหนดขั้นพื้นฐานสำหรับการให้แสงในโลก voxel น่าจะเป็น

  1. อัปเดตเร็วพอที่จะเกิดขึ้นในเฟรมเดียว หนึ่งอาจทำแสงสว่างในอุปกรณ์กราฟิกและดาวน์โหลดข้อมูลแสงที่เปลี่ยนแปลงไปยัง RAM หลัก
  2. ข้อมูลแสงจะต้องพร้อมใช้งานอย่างรวดเร็วสำหรับตรรกะของเกมหลักดังนั้นจึงไม่ได้ขึ้นอยู่กับอุปกรณ์กราฟิกทั้งหมด: การให้เหตุผล: แสงมีผลต่อการเจริญเติบโตของหญ้าการวางไข่ของสัตว์ประหลาดเป็นต้น
  3. การอัปเดตไฟจะต้องอยู่ในพื้นที่ของกลุ่มหรือมีข้อ จำกัด อื่น ๆ เพื่อให้ไม่ต้องพึ่งพาโลกทั้งใบซึ่งอาจมีขนาดใหญ่มาก

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

คำตอบ:


7

การให้แสงใน Minecraft คำนวณแบบอะซิงโครนัสและถูกอบเข้ากับรูปทรงเรขาคณิต มันไม่ได้ทำแบบเรียลไทม์

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

ข้อมูลเพิ่มเติมสามารถดูได้ที่บล็อกของเขา: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work


ฉันรู้ว่า. ฉันคิดว่าฉันเขียนไว้ด้านบน (ลบความคมชัดความสว่าง 4 บิต)
Armin Ronacher

1

คุณไม่สามารถใช้ GPU Render เป็น Texture & double-buffer ผลลัพธ์ของคุณเพื่อให้คุณมีข้อมูลการคำนวณแสงที่สามารถอ่านย้อนกลับแต่ละเฟรมได้หรือไม่?

คุณจะจัดระเบียบข้อมูลสำหรับการให้แสงนี้ขึ้นอยู่กับคุณทั้งหมด แต่ฉันไม่เห็นว่าทำไมตัวเลือกนี้ไม่ควรเป็นตัวเลือกแรกสำหรับการตรวจสอบว่าสิ่งที่คุณต้องการทำคือการปรับปรุงความเร็วของอัลกอริทึมการส่องสว่างของคุณ .. ?


สิ่งที่ฉันคิด ค่อนข้าง GPU ทั้งหมดซึ่งแตกต่างจาก CPU ส่วนใหญ่ได้รับการออกแบบสำหรับการออกกำลังกายการคำนวณแบบขนานขนาดใหญ่นี้
Grant Peters

1

ผู้คนที่แสดงผลแบบเรียลไทม์ดูเหมือนจะมีเรื่องรัก ๆ ใคร่ ๆ กับ Minecraft มีความคิดเห็นบางอย่างเกี่ยวกับวิธีที่พวกเขายังไม่สามารถหาแสงสว่างได้ .. แต่คุณอาจต้องการติดตามการพัฒนา / ลิงก์เพิ่มเติม

http://www.realtimerendering.com/blog/?s=minecraft

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