3D 그래픽에서 앰비언트 라이트(Ambient Light)는 모든 빛이 오브젝트에 부딪히면서 만들어지는 간접 조명 효과를 모방한 것이다. 하지만 일정한 값을 가진 앰비언트 라이트는 비현실적이다. 앰비언트 오클루전(Ambient Occlusion)은 씬의 각 위치가 얼마나 주변에 의해 가려져 있는지 계산해 현실감을 더해주는 방식이다. 주위에 가려진 정도가 클수록 빛이 적게 닿아 어두워진다.
SSAO의 개념과 도입 배경
SSAO는 Screen-Space Ambient Occlusion의 약자로, 스크린 공간에서 주변의 깊이 정보를 사용해 빠르게 앰비언트 오클루전을 계산하는 방식이다. 기존의 방식은 각 지점에서 여러 방향으로 가상의 광선을 쏘아 차폐 정도를 측정했지만, 연산량이 너무 커서 실시간 렌더링에는 적합하지 않았다. SSAO는 깊이 버퍼(Depth Buffer)를 사용해 계산을 단순화함으로써 이 문제를 해결했다.
SSAO의 작동 방식
- 깊이 버퍼와 차폐 계산
SSAO는 각 픽셀 주변의 깊이 정보를 사용해 차폐를 계산한다. 화면의 각 픽셀 주위에 샘플 포인트를 두고, 샘플 위치의 깊이 값을 기준 픽셀과 비교하여 차폐 여부를 판단한다. 만약 샘플 위치가 기준 픽셀보다 깊이 값이 작으면, 해당 위치는 차폐된 것으로 간주하여 어둡게 표현한다. - 샘플링을 통한 차폐 강도 계산
각 픽셀 주변에 여러 방향으로 샘플을 배치해 차폐 정도를 계산한다. 차폐가 많은 영역은 오클루전 값이 높아지고, 이 값에 따라 어두운 영역을 표현해 자연스러운 깊이감과 공간감을 구현한다. - 샘플 수와 화질 간의 균형
샘플 수가 적으면 계산이 빠르지만, 밴딩 현상(Banding)이라는 시각적 단점이 발생한다. 샘플 수를 늘리면 밴딩 현상은 줄어들지만 성능 저하가 있을 수 있어, 적절한 샘플 수와 품질을 고려해 설정해야 한다. - 반구형 샘플 커널
평평한 표면에 구형 커널을 사용하면 불필요한 차폐가 생길 수 있다. 이를 해결하기 위해 픽셀의 표면 노멀 방향으로 반구형 커널을 회전시켜, 표면의 실제 기울기와 방향을 반영한 차폐 효과를 얻는다. - 랜덤 회전 및 블러 처리
샘플링 커널을 픽셀마다 랜덤하게 회전시키고, 블러 처리로 부드러운 오클루전 효과를 만든다. 이를 통해 밴딩을 줄이고 자연스러운 결과를 얻는다.
SSAO에 필요한 구성 요소
- G-buffer: SSAO는 포지션(Position), 노멀(Normal), 알베도(Albedo) 등의 정보를 포함한
G-buffer
가 필요하다. 이를 통해 픽셀의 위치와 방향에 대한 정보가 주어져 주변 차폐를 계산할 수 있다. - 샘플 커널: 차폐 정도를 계산하기 위해 각 픽셀 주변에 설정된 샘플링 위치다.
- 랜덤 회전 벡터: 샘플링 커널의 방향을 픽셀마다 무작위로 조정해 밴딩을 줄이고, 더 자연스러운 결과를 얻는다.
SSAO는 단순한 연산으로도 빠르게 실시간 앰비언트 오클루전을 구현할 수 있으며, 깊이와 차폐 정보를 반영해 현실감 있는 그림자를 만들어내는 데 매우 유용하다.
'Computer Graphics > OpenGL' 카테고리의 다른 글
OpenGL 정리 - 30. 이미지 기반 조명 (Image-Based Lighting, IBL) (1) | 2024.11.10 |
---|---|
OpenGL 정리 - 29. 물리 기반 렌더링 (Physically Based Rendering, PBR) (1) | 2024.11.10 |
OpenGL 정리 - 27. Deffered Shading (0) | 2024.11.10 |
OpenGL 정리 - 26. HDR, Bloom (1) | 2024.11.10 |
OpenGL 정리 - 25. Normal Mapping (0) | 2024.11.10 |