我正在创建一个体素游戏,现在我需要计算每个块的光照水平,但是我不知道如何实现“现实的”光照传播系统。
此刻,我只检查上面是否有一个块,这确定了当前块的亮度:
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;
}
}
}
}
}
因此,目前只有暗块和亮块,但没有实际传播。我希望在暗块和亮块之间实现平滑过渡。
此刻没有障碍物发光,所以目前只是太阳光。