SlideShare a Scribd company logo
1 of 72
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
끝

More Related Content

What's hot

[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1
MoonLightMS
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
henjeon
 
Compute shader
Compute shaderCompute shader
Compute shader
QooJuice
 

What's hot (20)

Motion blur
Motion blurMotion blur
Motion blur
 
High dynamic range
High dynamic rangeHigh dynamic range
High dynamic range
 
[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1
 
Screen space reflection
Screen space reflectionScreen space reflection
Screen space reflection
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
 
Deferred decal
Deferred decalDeferred decal
Deferred decal
 
2018.12.22 깊이 버퍼 그림자 매핑
2018.12.22 깊이 버퍼 그림자 매핑2018.12.22 깊이 버퍼 그림자 매핑
2018.12.22 깊이 버퍼 그림자 매핑
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우
 
카툰 렌더링
카툰 렌더링카툰 렌더링
카툰 렌더링
 
[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해
 
아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더아티스트에게 사랑받는 3DS Max 우버쉐이더
아티스트에게 사랑받는 3DS Max 우버쉐이더
 
감마가 어디감마
감마가 어디감마감마가 어디감마
감마가 어디감마
 
[데브루키] Color space gamma correction
[데브루키] Color space gamma correction[데브루키] Color space gamma correction
[데브루키] Color space gamma correction
 
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다  공개용
물리 기반 셰이더의 허와 실:물리기반 셰이더를 가르쳐 봤습니다 공개용
 
Compute shader
Compute shaderCompute shader
Compute shader
 
Rendering Tech of Space Marine
Rendering Tech of Space MarineRendering Tech of Space Marine
Rendering Tech of Space Marine
 
언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정
 
마른 하늘에 날구름 넣기
 마른 하늘에 날구름 넣기 마른 하늘에 날구름 넣기
마른 하늘에 날구름 넣기
 

Viewers also liked

[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발
MinGeun Park
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개
noerror
 
[0529 박민근] 전역조명(global illumination)
[0529 박민근] 전역조명(global illumination)[0529 박민근] 전역조명(global illumination)
[0529 박민근] 전역조명(global illumination)
MinGeun Park
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)
MinGeun Park
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
JP Jung
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
MinGeun Park
 

Viewers also liked (13)

[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개
 
Ssao
SsaoSsao
Ssao
 
[0529 박민근] 전역조명(global illumination)
[0529 박민근] 전역조명(global illumination)[0529 박민근] 전역조명(global illumination)
[0529 박민근] 전역조명(global illumination)
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)
 
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
 
[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머
 
물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역
 
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
 
[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개
 
Ssao
SsaoSsao
Ssao
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 

Similar to Ssao

Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
MoonLightMS
 
후처리알아보기
후처리알아보기후처리알아보기
후처리알아보기
종규 우
 
247 deview 2013 이미지 분석 - 민재식
247 deview 2013 이미지 분석 - 민재식247 deview 2013 이미지 분석 - 민재식
247 deview 2013 이미지 분석 - 민재식
NAVER D2
 

Similar to Ssao (10)

Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
Game Visual Art Technologies
Game Visual Art TechnologiesGame Visual Art Technologies
Game Visual Art Technologies
 
후처리알아보기
후처리알아보기후처리알아보기
후처리알아보기
 
247 deview 2013 이미지 분석 - 민재식
247 deview 2013 이미지 분석 - 민재식247 deview 2013 이미지 분석 - 민재식
247 deview 2013 이미지 분석 - 민재식
 
언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
 
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
 

Ssao