ssao
DESCRIPTION
[Devrookie]SSAO 발표 PTTRANSCRIPT
SSAO(Screen Space Ambient Occlusion)
2012.12.08
Devrookie
엠에스박
• Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
Ambient Occlusion
GI를 위해서 고려하는 부분중 하나로 Ambient
값에 관련된 부분이다.
기본 조명 모델 중 Diffuse + Specular 위주의
계산을 하고 Ambient는 상수로 지정하는데 이
번 스터디에서는 Ambient 계산에 대한 내용을
다룬다.
Ambient Occlusion
물체의 구석진 곳이나 주름진 곳등 특정 부분에
는 빛이 상대적으로 가려지거나 잘 받지 못하기
때문에 다른 부분보다 어둡다.
즉, 빛이 차폐된 정도를 계산한 것이라고 보면
된다.
Ambient Occlusion
AO(Global) Diffuse(Local) Combined
Ambient Occlusion
Ambient Occlusion
Ambient Occlusion
Ambient Occlusion
특정 점을 기준으로 구를 그려 한번씩 가봐서
다른 점이 나온다면 그 점에 대해서 차폐된 것
이다.
구 전체에 적용하면 정확하게 얼마만큼 차폐되
었는지 구할 수 있다.
Ambient Occlusion
(b)가 (a)보다 어두울 것이다!
Ambient Occlusion
계산은 P에서 부터 주변의 거리를 측정한다.
Ambient Occlusion
퀄리티 vs 퍼포먼스
정확하게 계산하면 할 수록
퀄리티는 Up
퍼포먼스는 Down
Ambient Occlusion
실시간 게임에는 사용하기 힘들다.
이론상은 알았지만 적용하지 못하고 있던 가운데…
Crytek서 Screen Space에서 계산하는 Ambient Occlusion을 Crysis에 적용하였다!!
Ambient Occlusion
두둥
• Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
SSAO
2007 SIGGRAPH conference에서
Martin Mittring이 발표한
Finding Next Gen – CryEngine 2에 소개된 기법
SSAO
Screen Space에서 계산을 하기 때문에 화면에
보이는 녀석만 처리할 수 있어 빠르다.
하지만 이 방법도 정확할수록 느려진다.
SSAO
퀄리티와 퍼포먼스를 높이기 위한 발전 방향
최소의 리소스
최소의 연산
다양한 방법들이 생겨났다.
• Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
깊이 버퍼 SSAO
DepthBuffer -> SSAO Buffer -> Lighting
깊이 버퍼를 가지고 AO를 구하는 기법
깊이 버퍼 SSAO
깊이 버퍼 SSAO
깊이 버퍼 SSAO
해당 범위
에서 탐색
깊이 버퍼 SSAO
단순화된 샘플링 커널
깊이 버퍼 SSAO
깊이 버퍼 SSAO
깊이 버퍼 SSAO
깊이 버퍼 SSAO
깊이 버퍼 SSAO
깊이 버퍼 SSAO
샘플링 커널 벡터 생성
깊이 버퍼 SSAO
랜덤하게 벡터 얻어오기
임의의 노말맵
깊이 버퍼 SSAO
거리에 따른 커널 사이즈 구하기
깊이 버퍼 SSAO
Ambient Occlusion 구하기
반사를 이용해 랜덤성을 더 부여
깊이 버퍼 SSAO
더해준 만큼 나눠줘서 정규화
깊이 버퍼 SSAO
깊이 버퍼 SSAO
앞에서 만든 SSAO 버퍼를 읽어와 일반 조명계
산에 추가해준다.
부드러운 결과를 얻으려면 샘플링 해주면 된다.
깊이 버퍼 SSAO
깊이 버퍼 SSAO
• Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
뷰 스페이스 노말, 깊이SSAO
위 방식에는 문제점이 보인다.
Halo : 경계 부분에서 흰색이 나타난다.
Self Occlusion : 전체적으로 회색급이다.
뷰 스페이스 노말, 깊이 SSAO
구 범위에서 차폐된 정도가 값으로 정해지기 때문.
뷰 스페이스 노말, 깊이
SSAO
아이디어는 가져오되 다른 방법이 많이 고려되
었다.
그 중 뷰 스페이스 노말, 깊이 SSAO를 알아보
자.
뷰 스페이스 노말, 깊이
SSAO
먼저 뷰 스페이스 노말, 깊이 맵을 만든다.
뷰 스페이스 노말, 깊이
SSAO
먼저 뷰 스페이스 노말, 깊이 맵을 만든다.
뷰 스페이스 노말, 깊이
SSAO
계산에 필요한 것은 위치값이기 때문에 깊이값
을 이용해서 위치값을 얻어오는 방법에 대해서
알아보자.
* 위치를 담아둔 맵이 있으면 그냥 사용하면 된
다.
뷰 스페이스 노말, 깊이 SSAO
Frustum 좌표를 이용해서 위치를 얻어올 수 있다.
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이SSAO
Frustum 좌표를 만들어서 쉐이더에 넘겨준다.
뷰 스페이스 노말, 깊이 SSAO
Quad를 그려줄때 normal에 인덱스값을 넣어준다.
뷰 스페이스 노말, 깊이SSAO
Vertex Shader에서 아까 구했던 Frustum 좌표를 Pixel Shader로 보내준다.
뷰 스페이스 노말, 깊이 SSAO
현재 픽셀에 해당하는 뷰 공간 위치를 얻어온다.
랜덤 벡터를 만들어 낸다.
* offset 벡터를 구하는 부분은 위의 내용과 같다.
뷰 스페이스 노말, 깊이 SSAO
Offset 벡터와 노말의 내적을 구해서 부호를 구한다.
현재 위치에서 부터 차폐를 검사할 벡터를 구한다.
* flip을 곱해줌으로써 반구 방향으로만 계산
뷰 스페이스 노말, 깊이
SSAO
구한 벡터에 Projection * Texture Projection 행
렬을 곱해서 스크린 좌표를 구한다.
구한 좌표에 해당하는 깊이값을 구하고 깊이값
에 매치가 되는 뷰 공간 좌표를 구한다.
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이 SSAO
P와 R은 같은 평면상에 있으므로 차폐 계산에서제외시켜야 한다. -> 노말을 이용해서 계산
뷰 스페이스 노말, 깊이
SSAO
노말과의 내적연산을 해서 그 값을 Occlusion값
에 적용한다. (같은 평면이면 0)
차폐된 값을 구하면 된다.
뷰 스페이스 노말, 깊이 SSAO
차폐 계산에 대해서 Eipsilon 값을 두어서 특정 거리는 계산에서 제외시키고 차폐를 계산할 거리의범위를 두어서 선형적으로 계산한다. (값의 조절이필요)
뷰 스페이스 노말, 깊이SSAO
차폐를 계산한 만큼 나눠줘서 차폐 값을 맞춰준다.
차폐된 값을 적절히 변화를 줘서 적용하면 된다.
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이
SSAO
적절히 계산이 된 것 같기는 하지만 바로 적용
하기에는 부드러워 보이지 않는다.
SSAO를 구현하면 SSAO 맵을 만든 다음 나오
는 부분이 바로 Blur를 적용하는 것이다.
뷰 스페이스 노말, 깊이SSAO
Blur를 계산할 때 고려해야할 점은
경계부분은 유지를 하면서 (Edge Preserving)
노이즈를 부드럽게 변환시키는 것이다. (Smooth)
노말, 깊이 맵을 참조해서 Blur를 계산할 수 있다.
뷰 스페이스 노말, 깊이SSAO
핵심 알고리즘만 보면…
현재 픽셀의 노말값과 깊이값을 구해둔다.
샘플링할 픽셀의 노말값과 의 내적과 깊이 차이를 통과한 부분만 샘플링을 함으로써 경계를 유지할 수 있다.
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이
SSAO
뷰 스페이스 노말, 깊이
SSAO
발전
• SSDO
• HDAO
• HBAO
찾아서 정리하는대로 올리겠습니다. -0-;;
결론
SSAO는 Ambient Occlusion을 실시간으로 적
용하려는 노력에서 나온 기법중 하나고 점차 발
전해 나가고 있다.
Deferred Rendering등 요즘 트렌드상에서 기본
적으로 노말, 깊이, 위치 맵을 얻어오기 때문에
적용하기 어렵지는 않을 것이다.
결론
게임에 따라서 적용했을 때 효과가 있는 프로젝
트가 있고 아닌 프로젝트가 있을 것이다. 상황
에 따라서 성능비가 그렇게 높지 않을 수 있으
니 무조건 사용하겠다는 생각은 버리는게 좋겠
다.
정적인 오브젝트가 많다면 라이트맵을 적용하
는게 퀄리티도 좋고 빠를것이다.
참고자료http://en.wikipedia.org/wiki/Ambient_occlusion
D3DBook
A Simple and Practical Approach to SSAO
http://blog.naver.com/sorkelf/40147954876
끝