J'utilise C # et XNA. Mon algorithme actuel d'éclairage est une méthode récursive. Cependant, cela coûte cher , au point où un bloc de 8x128x8 est calculé toutes les 5 secondes.
- Existe-t-il d'autres méthodes d'éclairage qui créeront des ombres à obscurité variable?
- Ou la méthode récursive est-elle bonne, et peut-être que je me trompe?
Il semble que les choses récursives soient fondamentalement chères (forcées de parcourir environ 25 000 blocs par bloc). Je pensais utiliser une méthode similaire au lancer de rayons, mais je ne sais pas comment cela fonctionnerait. Une autre chose que j'ai essayée était de stocker des sources de lumière dans une liste, et pour chaque bloc d'obtenir la distance à chaque source de lumière, et de l'utiliser pour l'éclairer au niveau correct, mais ensuite l'éclairage passerait à travers les murs.
Mon code de récursivité actuel est ci-dessous. Ceci est appelé de n'importe quel endroit du morceau qui n'a pas un niveau de lumière nul, après avoir effacé et rajouté la lumière du soleil et la torche.
world.get___at
est une fonction qui peut obtenir des blocs en dehors de ce bloc (c'est à l'intérieur de la classe de bloc). Location
est ma propre structure qui ressemble à un Vector3
, mais utilise des entiers au lieu de valeurs à virgule flottante. light[,,]
est le lightmap pour le morceau.
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);
}