Ssao2. • Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
3. Ambient Occlusion
GI를 위해서 고려하는 부분중 하나로 Ambient
값에 관련된 부분이다.
기본 조명 모델 중 Diffuse + Specular 위주의
계산을 하고 Ambient는 상수로 지정하는데 이
번 스터디에서는 Ambient 계산에 대한 내용을
다룬다.
13. Ambient Occlusion
실시간 게임에는 사용하기 힘들
다.
이론상은 알았지만 적용하지 못하고 있던 가운
데…
Crytek서 Screen Space에서 계산하는 Ambient
Occlusion을 Crysis에 적용하였다!!
15. • Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
19. • Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
33. 깊이 버퍼 SSAO
반사를 이용해 랜덤성을 더 부여
Ambient Occlusion 구하기
36. 깊이 버퍼 SSAO
앞에서 만든 SSAO 버퍼를 읽어와 일반 조명계
산에 추가해준다.
부드러운 결과를 얻으려면 샘플링 해주면 된다.
39. • Ambient Occlusion(AO)
• SSAO
• 깊이 버퍼 SSAO
• 뷰 스페이스 노말, 깊이 SSAO
40. 뷰 스페이스 노말, 깊이
SSAO
위 방식에는 문제점이 보인다.
Halo : 경계 부분에서 흰색이 나타난다.
Self Occlusion : 전체적으로 회색급이다.
41. 뷰 스페이스 노말, 깊이 SSAO
구 범위에서 차폐된 정도가 값으로 정해지기 때문.
42. 뷰 스페이스 노말, 깊이
SSAO
아이디어는 가져오되 다른 방법이 많이 고려되
었다.
그 중 뷰 스페이스 노말, 깊이 SSAO를 알아보
자.
45. 뷰 스페이스 노말, 깊이
SSAO
계산에 필요한 것은 위치값이기 때문에 깊이값
을 이용해서 위치값을 얻어오는 방법에 대해서
알아보자.
* 위치를 담아둔 맵이 있으면 그냥 사용하면 된
다.
46. 뷰 스페이스 노말, 깊이 SSAO
Frustum 좌표를 이용해서 위치를 얻어올 수 있다.
48. 뷰 스페이스 노말, 깊이
SSAO
Frustum 좌표를 만들어서 쉐이더에 넘겨준다.
49. 뷰 스페이스 노말, 깊이 SSAO
Quad를 그려줄때 normal에 인덱스값을 넣어준다.
50. 뷰 스페이스 노말, 깊이
SSAO
Vertex Shader에서 아까 구했던 Frustum 좌표
를 Pixel Shader로 보내준다.
51. 뷰 스페이스 노말, 깊이 SSAO
현재 픽셀에 해당하는 뷰 공간 위치를 얻어온다.
랜덤 벡터를 만들어 낸다.
* offset 벡터를 구하는 부분은 위의 내용과 같다.
52. 뷰 스페이스 노말, 깊이 SSAO
Offset 벡터와 노말의 내적을 구해서 부호를 구한
다.
현재 위치에서 부터 차폐를 검사할 벡터를 구한다.
* flip을 곱해줌으로써 반구 방향으로만 계산
53. 뷰 스페이스 노말, 깊이
SSAO
구한 벡터에 Projection * Texture Projection 행
렬을 곱해서 스크린 좌표를 구한다.
구한 좌표에 해당하는 깊이값을 구하고 깊이값
에 매치가 되는 뷰 공간 좌표를 구한다.
55. 뷰 스페이스 노말, 깊이 SSAO
P와 R은 같은 평면상에 있으므로 차폐 계산에서
제외시켜야 한다. -> 노말을 이용해서 계산
56. 뷰 스페이스 노말, 깊이
SSAO
노말과의 내적연산을 해서 그 값을 Occlusion값
에 적용한다. (같은 평면이면 0)
차폐된 값을 구하면 된다.
57. 뷰 스페이스 노말, 깊이 SSAO
차폐 계산에 대해서 Eipsilon 값을 두어서 특정 거
리는 계산에서 제외시키고 차폐를 계산할 거리의
범위를 두어서 선형적으로 계산한다. (값의 조절이
필요)
58. 뷰 스페이스 노말, 깊이
SSAO
차폐를 계산한 만큼 나눠줘서 차폐 값을 맞춰준
다.
차폐된 값을 적절히 변화를 줘서 적용하면 된
다.
60. 뷰 스페이스 노말, 깊이
SSAO
적절히 계산이 된 것 같기는 하지만 바로 적용
하기에는 부드러워 보이지 않는다.
SSAO를 구현하면 SSAO 맵을 만든 다음 나오
는 부분이 바로 Blur를 적용하는 것이다.
61. 뷰 스페이스 노말, 깊이
SSAO
Blur를 계산할 때 고려해야할 점은
경계부분은 유지를 하면서 (Edge Preserving)
노이즈를 부드럽게 변환시키는 것이다.
(Smooth)
노말, 깊이 맵을 참조해서 Blur를 계산할 수 있
다.
62. 뷰 스페이스 노말, 깊이
SSAO
핵심 알고리즘만 보면…
현재 픽셀의 노말값과 깊이값을 구해둔다.
샘플링할 픽셀의 노말값과 의 내적과 깊이 차이
를 통과한 부분만 샘플링을 함으로써 경계를 유
지할 수 있다.
69. 결론
SSAO는 Ambient Occlusion을 실시간으로 적
용하려는 노력에서 나온 기법중 하나고 점차 발
전해 나가고 있다.
Deferred Rendering등 요즘 트렌드상에서 기본
적으로 노말, 깊이, 위치 맵을 얻어오기 때문에
적용하기 어렵지는 않을 것이다.
70. 결론
게임에 따라서 적용했을 때 효과가 있는 프로젝
트가 있고 아닌 프로젝트가 있을 것이다. 상황
에 따라서 성능비가 그렇게 높지 않을 수 있으
니 무조건 사용하겠다는 생각은 버리는게 좋겠
다.
정적인 오브젝트가 많다면 라이트맵을 적용하
는게 퀄리티도 좋고 빠를것이다.