이론
사실 이 Ambient Occlusion (이하 AO) 은 이론적으로 정의하기가 좀 애매합니다. 근본적으로 말하면, 물리적으로 맞지 않다고 할까요?. 그냥 가리는 정도? 보이는 정도? 를 막연하게 정의할 뿐입니다. 공식은 이렇습니다(공식/이미지 출처 :Wikiepedia).
의미는 어렵지 않습니다. 먼저 P 지점에 반구를 쒸웁니다. 전체 반구에 대해서 적분을 하는 것이구요. 은 p 지점으로
방향으로 들어오는 빛이 반구 안에서 가려지면 0, 가려지지 않으면 1이 됩니다.
는 normalization 을 위한 것입니다. 원래 반지름이 단위 길이인 반구의 겉넓이를 적분하면
가 됩니다. 그런데,
가 cosine weighted 로 작동하여, 반구를 적분을 해보면
가 되는 것을 계산상으로 확인해볼 수 있습니다.
이런 검은 물체가 이렇게 반구 밖에 있으면 최대값을 갖지만,
반구 안으로 들어와 있으면 어느정도 가려지기 때문에 어두워집니다.
즉, 반구 안에 주변에 가려진 물체가 하나도 없으면, 최대 값인 1이 되고, 가려진 물체가 많을 수록 값이 적어집니다[1].
물리적인 의미가 좀 부족하다고 한 이유는, 실제로 빛은 먼 곳 사방으로 올 수 있기 때문입니다. 따라서 반구를 빛이 올 수 있는 모든 부분만큼 크게 한다면 광원과 닿지 않는 모든 부분은 다 0 이 되어서 사용할 수가 없습니다. 아무튼, 근사적이기 때문에 반구를 적당히 작게 두면 쓸만한 트릭이지요.
참고 자료
Origin of Ambient Occlusion - Obscurance
바로 아래에 소개된 대로 AO 의 시초는 2002년 ILM 이 소개했을 때입니다. 하지만, 근본적인 이론은 조금 더 멀리 갑니다. 98년 Zhukov 의 Rendering Techniques 발행 논문 An Ambient Light Illumination Model 입니다. 이론적으로 좀 더 엄밀하게 쓰여 있습니다.
참고 자료
- An Ambient Light Illumination Model (Rendering Techniques 1998)
Ambient Occlusion for Global Illumination
사실 AO 가 이론적으로 모호하긴 하지만, 그것도 사실상 엄밀하게 정의할 수 있는 것을 굳이 정의하지 않고 약간 쉬운 방법으로 정의할 뿐이고, 어차피 근사적으로 사용할 부분에서는 별 문제가 되지 않습니다. 대략적인 계산을 사용하는 것의 최초, 그리고 유명해진 계기는 Hayden Landis 가 SIGGRAPH 에서 강연한 Production-Ready Global Illumination(PDF 링크) 입니다.
이 분은 괴물 집단인 Industrial Light and Magic (ILM) 소속으로 영화에서 GI 를 위해 이 개념을 도입한 것입니다. 영화는 대부분의 CG 가 합성이기 때문에, 정확한 GI 계산을 하기 힘들거나 불가능합니다. 꼭 합성이 아니더라도, 정밀한 GI 계산은 매우 힘들고 오래 걸리기도 하구요.
참고 자료
- Production-Ready Global Illumination (PDF) (SIGGRAPH 2002 Course Note)
Ambient Occlusion for Game
요즘은 게임에서 점차 AO 를 늘려가는 추세입니다. Crytek 은 그동안 쉐이딩 쪽은 충분히 짜냈기 때문에 GI 로 넘어왔다고 말을 하고 있습니다[2]. 실제로 더이상은 아무리 쉐이딩 쪽을 짜내도 사실성이 그렇게 크게 달라지지 않습니다.
따라서, GI 가 최대한 도입이 되어야 하는데, 대부분의 기술들은 시간이 너무 걸리죠. AO 는 그 계산이 다른 방법들 보다 훨씬 근사적인 만큼, 훨씬 가볍습니다.
Ambient Occlusion Field
하지만, 원래 AO 기술도 사실은 만만치 않습니다. 다른 기술들에 비해 빠르거나 미리 계산할 수 잇다는 장점이 있을 뿐, 그것도 항상 장점을 가지고 있는 것은 아닙니다(물체가 변형되면 AO 값은 바뀌니까요). AO 자체가 많이 근사적일지라도, 정확한 AO 값을 계산하는 것은 오랜 시간이 걸려서 실시간으로 불가능합니다.
Ambient Occlusion Field (이하 AOF) 는 정적인 물체에 미리 AO 값들을 계산해서 Cube Map 형태로 저장해놓는 것입니다. 그 값을 자신이 쓰는게 아니라, 그 주변의 물체들이 쓰는 것이죠. 따라서 이 큐브맵이 생성이 되면, 주위 어떤 지점에서도 (근사적인) 이 물체에 대한 AO 값을 얻을 수가 있습니다. 큐브맵 하나로 AO 를 계산한다는 것이 사실상 대단한 것이죠.
참고 자료
- Ambient Occlusion Field (SIGGRAPH i3D 2005)
Screen Space Ambient Occlusion (SSAO)
2005년도에 i3D 논문으로 나온 AOF 는 사실 약점을 많이 가지고 있습니다. 큐브맵을 가진 오브젝트는 정적이어야 하며, 동시에 여러 물체에 대한 AO 를 얻으려면 시간이 엄청 오래 걸리거나 사실상 불가능합니다. 이 와중에 눈에서 보이는 것들의 AO 만 계산하고자 하는 SSAO (Screen Space Ambient Occlusion) 가 출현하게 되었습니다[3].
SSAO 가 사용된 첫 게임은 Crysis 1 입니다[4]. 사실 이 방법은 화날 정도로(응?) 간략화된 방법입니다. 주변 픽셀의 깊이 정보를 몇개 샘플링 해서 주변이 막혀 있는지 뚫려 있는지를 계산합니다. 즉, 반구를 아주 작게 씌운다음에 그 주변에 점을 뿅뿅뿅 찍고, 깊이 정보를 얻어내서 막혀 있는지 안막혀 있는지 대략적으로 확인하는 것이죠. 당연히 오차가 말도 못하게 큽니다(사실 이미 오차를 계산할 단계는 지난 것이죠. 정확한 AO 값 자체는 포기한 방법입니다.).
문제점은 제법 있습니다. 아니 많습니다. 일단, (관점에 따라서) 말도 안되는 이론(구현 방법)이구요. 의도 하지 않은 부분들, 사실적이지 않은 부분들이 많이 생깁니다. 그리고! 다른 방법에 비해서는 어마어마하게 빠르지만, 그래도!! 느립니다. 쩝..
하지만, 이렇게까지라도 해서 GI 를 흉내를 내야 좋은 결과가 나오겠죠.
참고 자료
- Finding next gen: CryEngine 2 (PDF) (SIGGRAPH 2007 Course Note)
SSAO 의 최신 기술과 변형된 방법
SSAO 관련 모든 문서를 다보진 않았는데, 열심히 시간나는데로 보고 있습니다. 그러다보면 정말 구현 방법이 많다는 것을 알 수 있습니다.
- 기본적으로 깊이 정보를 점으로 샘플링하는 것이 있구요.
- 노말 정보를 사용할 수 있습니다.
- Normal Bent 라는 걸 계산해서 사용하기도 합니다(AO 용 Normal 을 변경).
- 더 나아가서 단순 노말이 아니라, 노말 맵을 가지고 SSAO 를 계산하는데 사용할 수도 있구요(Normal Mapped Screen Space Diffuse Occlusion).
- 점을 샘플링링하기 보다는 선의 길이나 면적을 이용해서 샘플링하는 방법이 있습니다(Volumetric Obscurance).
- Screen Space Directional Occlusion (SSDO) 을 소개하는 논문도 있습니다만, 이건 아직 읽어보지 않았습니다.

Line Sampling 을 사용한 Volumetric Obscurance 입니다.
참고 자료
- Volumetric Obscurance (PDF) (SIGGRAPH i3D 2010)
- Approximating Dynamic Global Illumination in Screen Space (SSDO 논문)
- Ambient Occlusion Field (SIGGRAPH i3D 2005)
- Normal Mapped Screen Space Diffuse Occlusion (Gamedev.net)
그외 참고 자료
- StarCraft 2 - Effects & Techniques (PDF) SIGGRAPH 2008 Course Note)
- Light Propagation Volumes in CryEngine 3 (PDF)
간단 요약
- Ambient Occlusion 은 물리적인 정의를 하기 힘든, 극히 근사화 된 방법이다.
- 하지만 이 근사화된 방법 조차 절대적인 시간은 제법 걸리는 편이다(Raytracing 등을 사용해야함).
- Depth Buffer 를 이용한 방법이 Crytek 에서 제안되어 Crysis 1 에서 처음 사용 되고, SIGGRAPH 2007 을 통해 소개되었다[5].
- Depth Buffer 방식의 SSAO 는 근사화 된 AO 방식을 한번더 근사화 했기 때문에 정확성 등의 여러가지 문제/이슈들이 있다. 따라서 시간이 지날 수록 여러 변형/개선 된 방법 들이 소개 되고 있다.
- 참고 : 기본적인 AM 에서는
값이 1 과 0 의 값만 같는데, 좀 더 정확한 계산을 하는 곳에서는, 예를 들어 Obscurance 같은 용어를 사용하는 좀 더 정확한 계산에서는 거리 같은 계산을 함께 합니다. AM 는 이런 계산들 중 간략화된 특별한 케이스입니다. 그래서 물리적인 의미가 좀 이상한거죠. [본문으로]
- 출처 : Light Propagation Volumes in CryEngine 3 (PDF) (SIGGRAPH 2009 Course Note) [본문으로]
- Depth Buffer Based Ambient Occlusion 이라고도 불리웁니다. 오히려 SSAO 보다 이 용어가 더 정확하다고 생각하시는분도 계십니다(블로그 링크). [본문으로]
- 출처 : Wikipedia - Screen Space Ambient Occlusion [본문으로]
- 치사하게도 Crytek 은 이 방법을 제안한 프로그래머의 이름은 밝히지 않았습니다. 'One of our creative programmers' 라고만 했네요. -_-ㅋ (뭐, 그 처음 문서(Finding Next Gen)가 아닌 다른 곳에서는 얘기했을지 모르지만요.) [본문으로]







556732
404
460





댓글을 달아 주세요