마인크래프트 같은 Voxel 메쉬에 Ambient Occlusion 추가하기

2019-11-05

Main 값싼 Ambient Occlusion 추가하기!

목차

  1. 마인크래프트 같은 Voxel 게임에서 메쉬 최적화하기
  2. Greedy Meshing과 Texture Atalas 같이쓰기
  3. 마인크래프트 같은 Voxel 메쉬에 Ambient Occlusion 추가하기

Ambient Occlusion 이란?

Example of Ambient Occlusion Ambient Occlusion의 예시

Ambient Occlusion은 각 표면에 대해서 Ambient 광원에 얼마나 노출이 되어있는지를 계산하여 그림자를 더해주는 기법입니다. 즉, 표면에서 얼마나 많은 빛을 차단해야 하는지 계산하는 거죠. 예를 들어, 방의 구석이나 틈 부분은 다른 곳 보다 더 어두운데, 이를 이용하여 더욱 사실적인 느낌을 낼 수 있도록 할 수 있습니다.

Artifact of Ambient Occlusion 손 주위의 그림자가 어색하다

일반적인 아이디어는 Depth 버퍼와 Normal 버퍼를 이용해 각 픽셀에 대한 빛의 접근을 대략적으로 계산하는 것입니다. 하지만 Depth 버퍼는 실제 모델에 대한 정보가 아니기 때문에 많은 이상한 아티펙트가 생길 수 있죠.

Voxel 메쉬에서의 Ambient Occlusion

Ambient Occlusion Chart 한 정점에 대한 Voxel Ambient Occlusion의 네 가지 경우

Voxel 메쉬는 Screen Space에서 이루어지는 이상한 아티팩트와 독립적으로 Ambient Occlusion를 구현할 수 있습니다. 이 아이디어는 한 정점에 대해서 인접한 Voxel이 존재하는지 여부를 검사해서 음영을 추가하는 것입니다. 이를 생각하면 위와같이 4가지 경우가 가능합니다.

비등방성 문제점

Before After

Ambient Occlusion이 편향되게 그려진 모습

Quad를 그리기 위해서는 삼각형 두개로 나누어서 메쉬를 만들어야 합니다. 이때 삼각형이 만들어지는 방향에 따라서 Ambient Occlusion이 서로 다르게 그려지게 됩니다. 위 이미지에서는 왼쪽 위와 오른쪽 아래가 왼쪽 아래와 오른쪽 위가 서로 다른 모습을 볼 수 있습니다.

비등방성 문제 해결

Before After

Ambient Occlusion이 일정하게 그려진 모습

사실 이 문제는 해결하기 쉽습니다. 아이디어는 Quad를 만들 때 방향을 반대로 뒤집는 것 입니다. Quad의 4개의 정점이 시계방향으로 있다고 가정했을 때, 각 정점의 Ambient Occlusion 값을 a0, a1, a2, a3라고 합시다. 그렇다면 다음과 같이 고칠 수 있습니다.

if (a0 + a3 < a1 + a2)
{
    //뒤집힌 Quad 생성
}
else
{
    //원래의 Quad 생성
}

Greedy Meshing과 통합하기

Integrate with Grey Meshing Greedy Meshing된 Mesh에 Ambient Occlusion이 추가된 모습

Greedy Meshing과 통합하는 것은 간단합니다. Quad를 병합할지 판단하는 조건에 동일한 Ambient Occlusion의 Quad를 병합하도록 수정하면 됩니다.

결과

Before After

Ambient Occlusion 전 / 후

유용한 링크

코드 (Git Repository)

Ambient occlusion for Minecraft-like worlds (0fps)