Я создаю воксельную игру, и теперь мне нужно рассчитать уровни света для каждого блока, но я понятия не имею, как реализовать «реалистичную» систему распространения света.
В данный момент я просто проверяюесли есть блок выше, и это определяет уровень освещенности для текущего блока:
public static void calcLight(Chunk chunk) {
Vector3i pos = chunk.getPosition();
byte[] lightLevels = chunk.getLightLevels();
for (int x = 0; x < Chunk.SIZE.x; x++) {
for (int z = 0; z < Chunk.SIZE.z; z++) {
//For every x and z check if blocks above
for (int y = Chunk.SIZE.y - 1; y >= 0; y--) {
Block blockAbove = World.instance.getBlockAt(
x + pos.x,
y + pos.y + 1,
z + pos.z);
if (blockAbove == null) {
//No block above
lightLevels[x * Chunk.SIZE.y * Chunk.SIZE.z + y * Chunk.SIZE.z + z] = 15;
} else if (blockAbove.isTransparent()){
//Block above is transparent
lightLevels[x * Chunk.SIZE.y * Chunk.SIZE.z + y * Chunk.SIZE.z + z] = World.instance.getLightLevelAt(pos.x + x, pos.y + y + 1, pos.z + z);
} else {
//Block above is solid
lightLevels[x * Chunk.SIZE.y * Chunk.SIZE.z + y * Chunk.SIZE.z + z] = 5;
}
}
}
}
}
Таким образом, в настоящий момент есть только темные и яркие блоки, но реального распространения не происходит.Я хочу плавного перехода между темными и светлыми блоками.
На данный момент нет блоков, излучающих свет, поэтому на данный момент это просто солнечный свет.