ฉันใช้ C # และ XNA อัลกอริทึมปัจจุบันของฉันสำหรับให้แสงสว่างเป็นวิธีเรียกซ้ำ อย่างไรก็ตามมันมีราคาแพงจนถึงจุดที่ก้อน 8x128x8 หนึ่งก้อนคำนวณทุก 5 วินาที
- มีวิธีการให้แสงแบบอื่นที่จะทำให้เกิดเงาแบบแปรผันได้หรือไม่?
- หรือวิธีการเวียนเกิดเป็นวิธีที่ดีและบางทีฉันอาจทำผิด
ดูเหมือนว่าสิ่งที่เกิดขึ้นซ้ำ ๆ นั้นมีราคาแพง (ถูกบังคับให้ผ่านบล็อกประมาณ 25k ต่อก้อน) ฉันกำลังคิดเกี่ยวกับการใช้วิธีการคล้ายกับการติดตามรังสี แต่ฉันไม่รู้ว่ามันจะทำงานอย่างไร อีกสิ่งหนึ่งที่ฉันพยายามคือการจัดเก็บแหล่งกำเนิดแสงในรายการและสำหรับแต่ละบล็อกจะได้ระยะห่างจากแหล่งกำเนิดแสงแต่ละจุดและการใช้แสงนั้นไปยังระดับที่ถูกต้อง แต่แสงจะผ่านกำแพง
รหัสการเรียกซ้ำปัจจุบันของฉันอยู่ด้านล่าง สิ่งนี้ถูกเรียกจากที่ใด ๆ ในก้อนที่ไม่มีระดับแสงเป็นศูนย์หลังจากการล้างและเพิ่มแสงแดดและคบไฟใหม่
world.get___at
เป็นฟังก์ชั่นที่สามารถรับบล็อกด้านนอกของก้อนนี้ (นี่คือภายในชั้นเรียนชิ้น) Location
เป็นโครงสร้างของตัวเองที่คล้ายกับ a Vector3
แต่ใช้จำนวนเต็มแทนค่าทศนิยม light[,,]
เป็น lightmap สำหรับชิ้นข้อมูล
private void recursiveLight(int x, int y, int z, byte lightLevel)
{
Location loc = new Location(x + chunkx * 8, y, z + chunky * 8);
if (world.getBlockAt(loc).BlockData.isSolid)
return;
lightLevel--;
if (world.getLightAt(loc) >= lightLevel || lightLevel <= 0)
return;
if (y < 0 || y > 127 || x < -8 || x > 16 || z < -8 || z > 16)
return;
if (x >= 0 && x < 8 && z >= 0 && z < 8)
light[x, y, z] = lightLevel;
recursiveLight(x + 1, y, z, lightLevel);
recursiveLight(x - 1, y, z, lightLevel);
recursiveLight(x, y + 1, z, lightLevel);
recursiveLight(x, y - 1, z, lightLevel);
recursiveLight(x, y, z + 1, lightLevel);
recursiveLight(x, y, z - 1, lightLevel);
}