ฉันไม่รู้ว่าคุณกำลังเขียนโปรแกรมอะไรอยู่ แต่นี่เป็นวิธีที่ฉันจัดการใน XNA:
- ในการเรียกการดึง
List<Light>
วัตถุจะถูกสร้าง / ล้าง
- ในระหว่างการลากไทล์แต่ละไทล์จะถูกตรวจสอบเพื่อดูว่ามีไฟใด ๆ ที่เกี่ยวข้องหรือไม่ ถ้ามันไม่ที่วัตถุที่มีการผนวกเข้ากับ
Light
List<Light>
RenderTarget2D
กระเบื้องจะมีการวาดลงบนของตัวเอง
- หลังจากวนลูปไทล์รายการของ
Light
s ถูกทำซ้ำแล้ววาดด้วยตนเองRenderTarget2D
โดยใช้พื้นผิวที่ฉันทำเช่นนี้:
(หมายเหตุ: ฉันใช้ค่า R, G และ B ที่นี่ แต่คุณควรใช้ช่องอัลฟาใน พื้นผิวจริง.)
- ใช้ shader ที่กำหนดเองฉันแสดงพื้นผิวของกระเบื้องไปยังหน้าจอและส่งผ่านพื้นผิวแสงเป็นพารามิเตอร์ซึ่งได้รับการสุ่มตัวอย่างสำหรับค่า "ความมืด" ที่แต่ละพิกเซล
ตอนนี้มีบางสิ่งที่ควรทราบ:
เกี่ยวกับจุดที่ 4:
จริง ๆ แล้วฉันมีสองเฉดสีที่กำหนดเองหนึ่งที่จะวาดแสงไปยังเป้าหมายแสงการแสดงผล (ขั้นตอนที่ 4) และอื่น ๆ เพื่อวาดเป้าหมายการแสดงผลกระเบื้องไปยังหน้าจอโดยใช้เป้าหมายแสงการแสดงผล (ขั้นตอนที่ 5)
Shader ที่ใช้ที่จุดที่ 4 ทำให้ฉันสามารถเพิ่ม (สิ่งที่ฉันเรียก) เป็นค่า "ความส่องสว่าง" ค่านี้เป็นค่าfloat
ที่คูณกับแต่ละพิกเซลในพื้นผิวก่อนที่จะเพิ่มไปยังเป้าหมายการเรนเดอร์เพื่อที่ฉันจะสามารถทำให้แสงสว่างขึ้นหรือมืดลงได้
ณ จุดนี้ฉันยังคำนึงถึงค่า "ระดับ" ของแสงซึ่งหมายความว่าฉันสามารถมีแสงขนาดใหญ่หรือขนาดเล็กที่ใช้เพียงพื้นผิวเดียว
เกี่ยวกับจุดที่ 5:
คิดว่าเป้าหมายการให้แสงนั้นมีค่าสำหรับแต่ละพิกเซลตั้งแต่ 0 (ดำ) ถึง 1 (สีขาว) Shader นั้นคูณด้วยค่านั้นกับค่า RGB สำหรับพิกเซลในการเรนเดอร์เป้าหมายเพื่อสร้างภาพที่วาดครั้งสุดท้าย
ฉันยังมีรหัสเพิ่มเติมที่นี่ที่ฉันผ่าน (เพื่อ shader) ค่าที่จะใช้เป็นสีซ้อนทับกลางวัน / กลางคืน สิ่งนี้จะถูกนำไปคูณกับค่า RGB และรวมอยู่ในการคำนวณการแสดงผลเป้าหมายแสง
ทีนี้สิ่งนี้จะไม่อนุญาตให้คุณทำสิ่งต่าง ๆ เช่นป้องกันแสงจากการไปรอบวัตถุและอะไรก็ตาม แต่อย่างน้อยสำหรับจุดประสงค์ของฉันมันง่ายและทำงานได้ดี
ฉันเขียนบทความบล็อกที่มีรายละเอียดมากขึ้นที่นี่และที่นี่ซึ่งอาจช่วยคุณได้ ฉันยังไม่มีเวลา แต่ถ้าคุณต้องการฉันสามารถดูรายละเอียดเพิ่มเติมที่นี่ใน gamedev
โอ้และนี่คือสิ่งที่ฉันเห็นในเครื่องมือแก้ไขแผนที่ของฉัน: