计算体素世界的光照水平

时间:2019-06-16 01:58:57

标签: java arrays algorithm graphics voxel

我正在创建一个体素游戏,现在我需要计算每个块的光照水平,但是我不知道如何实现“现实的”光照传播系统。

此刻,我只检查上面是否有一个块,这确定了当前块的亮度:

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

因此,目前只有暗块和亮块,但没有实际传播。我希望在暗块和亮块之间实现平滑过渡。

此刻没有障碍物发光,所以目前只是太阳光。

0 个答案:

没有答案