Computer Graphics/OpenGL

OpenGL 정리 - 28. Screen-Space Ambient Occlusion (SSAO)

surkim 2024. 11. 10. 13:08

3D 그래픽에서 앰비언트 라이트(Ambient Light)는 모든 빛이 오브젝트에 부딪히면서 만들어지는 간접 조명 효과를 모방한 것이다. 하지만 일정한 값을 가진 앰비언트 라이트는 비현실적이다. 앰비언트 오클루전(Ambient Occlusion)은 씬의 각 위치가 얼마나 주변에 의해 가려져 있는지 계산해 현실감을 더해주는 방식이다. 주위에 가려진 정도가 클수록 빛이 적게 닿아 어두워진다.

SSAO의 개념과 도입 배경

SSAO는 Screen-Space Ambient Occlusion의 약자로, 스크린 공간에서 주변의 깊이 정보를 사용해 빠르게 앰비언트 오클루전을 계산하는 방식이다. 기존의 방식은 각 지점에서 여러 방향으로 가상의 광선을 쏘아 차폐 정도를 측정했지만, 연산량이 너무 커서 실시간 렌더링에는 적합하지 않았다. SSAO는 깊이 버퍼(Depth Buffer)를 사용해 계산을 단순화함으로써 이 문제를 해결했다.

SSAO의 작동 방식

  1. 깊이 버퍼와 차폐 계산
    SSAO는 각 픽셀 주변의 깊이 정보를 사용해 차폐를 계산한다. 화면의 각 픽셀 주위에 샘플 포인트를 두고, 샘플 위치의 깊이 값을 기준 픽셀과 비교하여 차폐 여부를 판단한다. 만약 샘플 위치가 기준 픽셀보다 깊이 값이 작으면, 해당 위치는 차폐된 것으로 간주하여 어둡게 표현한다.
  2. 샘플링을 통한 차폐 강도 계산
    각 픽셀 주변에 여러 방향으로 샘플을 배치해 차폐 정도를 계산한다. 차폐가 많은 영역은 오클루전 값이 높아지고, 이 값에 따라 어두운 영역을 표현해 자연스러운 깊이감과 공간감을 구현한다.
  3. 샘플 수와 화질 간의 균형
    샘플 수가 적으면 계산이 빠르지만, 밴딩 현상(Banding)이라는 시각적 단점이 발생한다. 샘플 수를 늘리면 밴딩 현상은 줄어들지만 성능 저하가 있을 수 있어, 적절한 샘플 수와 품질을 고려해 설정해야 한다.
  4. 반구형 샘플 커널
    평평한 표면에 구형 커널을 사용하면 불필요한 차폐가 생길 수 있다. 이를 해결하기 위해 픽셀의 표면 노멀 방향으로 반구형 커널을 회전시켜, 표면의 실제 기울기와 방향을 반영한 차폐 효과를 얻는다.
  5. 랜덤 회전 및 블러 처리
    샘플링 커널을 픽셀마다 랜덤하게 회전시키고, 블러 처리로 부드러운 오클루전 효과를 만든다. 이를 통해 밴딩을 줄이고 자연스러운 결과를 얻는다.

SSAO에 필요한 구성 요소

  • G-buffer: SSAO는 포지션(Position), 노멀(Normal), 알베도(Albedo) 등의 정보를 포함한 G-buffer가 필요하다. 이를 통해 픽셀의 위치와 방향에 대한 정보가 주어져 주변 차폐를 계산할 수 있다.
  • 샘플 커널: 차폐 정도를 계산하기 위해 각 픽셀 주변에 설정된 샘플링 위치다.
  • 랜덤 회전 벡터: 샘플링 커널의 방향을 픽셀마다 무작위로 조정해 밴딩을 줄이고, 더 자연스러운 결과를 얻는다.

SSAO는 단순한 연산으로도 빠르게 실시간 앰비언트 오클루전을 구현할 수 있으며, 깊이와 차폐 정보를 반영해 현실감 있는 그림자를 만들어내는 데 매우 유용하다.