Рассчитайте уровни света для воксельного мира - PullRequest
0 голосов
/ 16 июня 2019

Я создаю воксельную игру, и теперь мне нужно рассчитать уровни света для каждого блока, но я понятия не имею, как реализовать «реалистичную» систему распространения света.

В данный момент я просто проверяюесли есть блок выше, и это определяет уровень освещенности для текущего блока:

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;
                }
            }
        }
    }
}

Таким образом, в настоящий момент есть только темные и яркие блоки, но реального распространения не происходит.Я хочу плавного перехода между темными и светлыми блоками.

На данный момент нет блоков, излучающих свет, поэтому на данный момент это просто солнечный свет.

...