SSAO ( Screen Space Ambient Occlusion )
Game programing/Global Ilumination / 2013. 6. 17. 18:32
SSAO를 만드는 방식은 생각보다 여러가지가 있는거 같다. 많은 분들이 구현하셔서 웹상에 공유해주신 덕분에 나도 한번 만들어 봤다.
엔진개발에서 렌더링 관련 쉐이더중 TA님이 필수로 요청한 부분이라 다른 님들의 공유 소스를 보고 분석해서 따라 만들어 봤다.
렌더몽키로 샘플을 만들어 봤다. 렌더몽키라 텍스쳐를 하나만 세팅했더니 이 꼴로 나온다.
샘플링된 차폐요소를 차폐방향으로 스크린 AO맵을 만들어서 빛의 방향에 대해서 다시한번 Dot연산을 통해 차폐가 있다고 하더라도
빛이 직접적으로 들어오는 곳은 약하게 처리하게 만들었다. 또 Enlighten 처럼 거리에 따라서 AO맵의 적용을 다르게 하는 부분을
추가하여 멀어 질수록 차폐값을 감쇠하게 만들었다. 하지만 여전히 허접하며 많은 관련 소스를 분석해서 다시 만들어 봐야겠다.
[ 렌더 타겟 ]
Diffuse - 일차적인 전역 조명 처리를 한 버퍼
SSAO - 차폐에 대한 정보를 기록한 버퍼
- 가우시안 필터링 적용 X축
- 가우시안 필터링 적용 Y축
[ 최종 이미지 ]
[ 문제점 ]
halo 현상이 심각하게 발생하고 있다.
구현하면서 뭔가 놓친 부분이 있는거 같기도 하고 아니면 방안을 조금 고민해서 덜하게 만들고 싶다.
CryTech 문서에 보면 self-Occlusion이 발생하여 halo가 발생한다고 한다. 맞는 소리긴 한데 이상한건 CryTech에서 설명한 방법대로 하면 halo가 거의 일어나지 않는다는데 Crysys2에서 많이 발생하던데..