C #과 XNA를 사용하고 있습니다. 현재 조명에 대한 알고리즘은 재귀 적 방법입니다. 그러나 하나의 8x128x8 청크가 5 초마다 계산되는 지점 까지는 비용 이 많이 듭니다 .
- 가변 어두운 그림자를 만드는 다른 조명 방법이 있습니까?
- 아니면 재귀 적 방법이 좋으며 아마도 내가 잘못하고 있습니까?
재귀 적 인 물건은 근본적으로 비싸다 (청크 당 약 25k 블록을 통과해야 함). 광선 추적과 비슷한 방법을 사용하려고 생각했지만 이것이 어떻게 작동하는지 전혀 모릅니다. 내가 시도한 또 다른 것은 광원을 List에 저장하고 각 블록마다 각 광원까지의 거리를 가져 와서 올바른 레벨로 조명하는 데 사용했지만 조명은 벽을 통과합니다.
현재 재귀 코드는 다음과 같습니다. 이것은 햇빛과 횃불을 비운 후 다시 추가 한 후 빛 레벨이 0이 아닌 청크의 어느 곳에서나 호출됩니다.
world.get___at
이 청크 외부에서 블록을 가져올 수있는 함수입니다 (청크 클래스 내부에 있음). Location
은 내 자신의 구조 Vector3
이지만 부동 소수점 값 대신 정수를 사용합니다. light[,,]
청크의 라이트 맵입니다.
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);
}