C # ve XNA kullanıyorum. Mevcut aydınlatma algoritması özyinelemeli bir yöntemdir. Bununla birlikte, her 8 saniyede bir 8x128x8 yığının hesaplandığı noktaya kadar pahalıdır .
- Değişken-karanlık gölgeler yaratacak başka aydınlatma yöntemleri var mı?
- Yoksa özyinelemeli yöntem iyi mi, belki de sadece yanlış yapıyorum?
Sadece özyinelemeli şeyler temelde pahalı gibi görünüyor (yığın başına yaklaşık 25 bin blok geçmek zorunda). Işın izlemeye benzer bir yöntem kullanmayı düşünüyordum, ama bunun nasıl çalışacağına dair hiçbir fikrim yok. Denediğim başka bir şey ışık kaynaklarını bir Listede saklamaktı ve her blok için her bir ışık kaynağına olan mesafeyi almak ve bunu doğru seviyeye aydınlatmak için kullanmaktı, ancak daha sonra aydınlatma duvarlardan geçecekti.
Mevcut özyineleme kodum aşağıda. Bu, güneş ışığını ve meşale ışığını temizleyip yeniden ekledikten sonra, yığın içinde ışık seviyesi sıfır olmayan herhangi bir yerden çağrılır.
world.get___at
blokları bu yığının dışında alabilen bir işlevdir (bu yığın sınıfının içindedir). Location
kendi yapım a gibi Vector3
, ancak kayan nokta değerleri yerine tamsayılar kullanıyor. light[,,]
yığın için ışık haritasıdır.
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);
}