Saya menggunakan C # dan XNA. Algoritma saya saat ini untuk pencahayaan adalah metode rekursif. Namun, itu mahal , ke titik di mana satu potongan 8x128x8 dihitung setiap 5 detik.
- Apakah ada metode pencahayaan lain yang akan membuat bayangan kegelapan variabel?
- Atau apakah metode rekursif itu baik, dan mungkin saya salah melakukannya?
Sepertinya hal-hal rekursif pada dasarnya mahal (dipaksa untuk melewati sekitar 25k blok per bongkahan). Saya sedang berpikir tentang menggunakan metode yang mirip dengan ray tracing, tetapi saya tidak tahu bagaimana ini akan berhasil. Hal lain yang saya coba adalah menyimpan sumber cahaya dalam Daftar, dan untuk setiap blok mendapatkan jarak ke setiap sumber cahaya, dan menggunakannya untuk menyalakannya ke tingkat yang benar, tetapi kemudian pencahayaan akan menembus dinding.
Kode rekursi saya saat ini ada di bawah. Ini disebut dari sembarang tempat di chunk yang tidak memiliki tingkat cahaya nol, setelah membersihkan dan menambahkan kembali sinar matahari dan cahaya obor.
world.get___at
adalah fungsi yang bisa mendapatkan blok di luar chunk ini (ini ada di dalam class chunk). Location
adalah struktur saya sendiri yang seperti Vector3
, tetapi menggunakan bilangan bulat bukan nilai floating point. light[,,]
adalah lightmap untuk chunk.
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);
}