ssao

72
SSAO (Screen Space Ambient Occlusion) 2012.12.08 Devrookie 엠에스박

Upload: minsu-park

Post on 08-Jul-2015

1.411 views

Category:

Technology


3 download

DESCRIPTION

[Devrookie]SSAO 발표 PT

TRANSCRIPT

Page 1: Ssao

SSAO(Screen Space Ambient Occlusion)

2012.12.08

Devrookie

엠에스박

Page 2: Ssao

• Ambient Occlusion(AO)

• SSAO

• 깊이 버퍼 SSAO

• 뷰 스페이스 노말, 깊이 SSAO

Page 3: Ssao

Ambient Occlusion

GI를 위해서 고려하는 부분중 하나로 Ambient

값에 관련된 부분이다.

기본 조명 모델 중 Diffuse + Specular 위주의

계산을 하고 Ambient는 상수로 지정하는데 이

번 스터디에서는 Ambient 계산에 대한 내용을

다룬다.

Page 4: Ssao

Ambient Occlusion

물체의 구석진 곳이나 주름진 곳등 특정 부분에

는 빛이 상대적으로 가려지거나 잘 받지 못하기

때문에 다른 부분보다 어둡다.

즉, 빛이 차폐된 정도를 계산한 것이라고 보면

된다.

Page 5: Ssao

Ambient Occlusion

AO(Global) Diffuse(Local) Combined

Page 6: Ssao

Ambient Occlusion

Page 7: Ssao

Ambient Occlusion

Page 8: Ssao

Ambient Occlusion

Page 9: Ssao

Ambient Occlusion

특정 점을 기준으로 구를 그려 한번씩 가봐서

다른 점이 나온다면 그 점에 대해서 차폐된 것

이다.

구 전체에 적용하면 정확하게 얼마만큼 차폐되

었는지 구할 수 있다.

Page 10: Ssao

Ambient Occlusion

(b)가 (a)보다 어두울 것이다!

Page 11: Ssao

Ambient Occlusion

계산은 P에서 부터 주변의 거리를 측정한다.

Page 12: Ssao

Ambient Occlusion

퀄리티 vs 퍼포먼스

정확하게 계산하면 할 수록

퀄리티는 Up

퍼포먼스는 Down

Page 13: Ssao

Ambient Occlusion

실시간 게임에는 사용하기 힘들다.

이론상은 알았지만 적용하지 못하고 있던 가운데…

Crytek서 Screen Space에서 계산하는 Ambient Occlusion을 Crysis에 적용하였다!!

Page 14: Ssao

Ambient Occlusion

두둥

Page 15: Ssao

• Ambient Occlusion(AO)

• SSAO

• 깊이 버퍼 SSAO

• 뷰 스페이스 노말, 깊이 SSAO

Page 16: Ssao

SSAO

2007 SIGGRAPH conference에서

Martin Mittring이 발표한

Finding Next Gen – CryEngine 2에 소개된 기법

Page 17: Ssao

SSAO

Screen Space에서 계산을 하기 때문에 화면에

보이는 녀석만 처리할 수 있어 빠르다.

하지만 이 방법도 정확할수록 느려진다.

Page 18: Ssao

SSAO

퀄리티와 퍼포먼스를 높이기 위한 발전 방향

최소의 리소스

최소의 연산

다양한 방법들이 생겨났다.

Page 19: Ssao

• Ambient Occlusion(AO)

• SSAO

• 깊이 버퍼 SSAO

• 뷰 스페이스 노말, 깊이 SSAO

Page 20: Ssao

깊이 버퍼 SSAO

DepthBuffer -> SSAO Buffer -> Lighting

깊이 버퍼를 가지고 AO를 구하는 기법

Page 21: Ssao

깊이 버퍼 SSAO

Page 22: Ssao

깊이 버퍼 SSAO

Page 23: Ssao

깊이 버퍼 SSAO

해당 범위

에서 탐색

Page 24: Ssao

깊이 버퍼 SSAO

단순화된 샘플링 커널

Page 25: Ssao

깊이 버퍼 SSAO

Page 26: Ssao

깊이 버퍼 SSAO

Page 27: Ssao

깊이 버퍼 SSAO

Page 28: Ssao

깊이 버퍼 SSAO

Page 29: Ssao

깊이 버퍼 SSAO

Page 30: Ssao

깊이 버퍼 SSAO

샘플링 커널 벡터 생성

Page 31: Ssao

깊이 버퍼 SSAO

랜덤하게 벡터 얻어오기

임의의 노말맵

Page 32: Ssao

깊이 버퍼 SSAO

거리에 따른 커널 사이즈 구하기

Page 33: Ssao

깊이 버퍼 SSAO

Ambient Occlusion 구하기

반사를 이용해 랜덤성을 더 부여

Page 34: Ssao

깊이 버퍼 SSAO

더해준 만큼 나눠줘서 정규화

Page 35: Ssao

깊이 버퍼 SSAO

Page 36: Ssao

깊이 버퍼 SSAO

앞에서 만든 SSAO 버퍼를 읽어와 일반 조명계

산에 추가해준다.

부드러운 결과를 얻으려면 샘플링 해주면 된다.

Page 37: Ssao

깊이 버퍼 SSAO

Page 38: Ssao

깊이 버퍼 SSAO

Page 39: Ssao

• Ambient Occlusion(AO)

• SSAO

• 깊이 버퍼 SSAO

• 뷰 스페이스 노말, 깊이 SSAO

Page 40: Ssao

뷰 스페이스 노말, 깊이SSAO

위 방식에는 문제점이 보인다.

Halo : 경계 부분에서 흰색이 나타난다.

Self Occlusion : 전체적으로 회색급이다.

Page 41: Ssao

뷰 스페이스 노말, 깊이 SSAO

구 범위에서 차폐된 정도가 값으로 정해지기 때문.

Page 42: Ssao

뷰 스페이스 노말, 깊이

SSAO

아이디어는 가져오되 다른 방법이 많이 고려되

었다.

그 중 뷰 스페이스 노말, 깊이 SSAO를 알아보

자.

Page 43: Ssao

뷰 스페이스 노말, 깊이

SSAO

먼저 뷰 스페이스 노말, 깊이 맵을 만든다.

Page 44: Ssao

뷰 스페이스 노말, 깊이

SSAO

먼저 뷰 스페이스 노말, 깊이 맵을 만든다.

Page 45: Ssao

뷰 스페이스 노말, 깊이

SSAO

계산에 필요한 것은 위치값이기 때문에 깊이값

을 이용해서 위치값을 얻어오는 방법에 대해서

알아보자.

* 위치를 담아둔 맵이 있으면 그냥 사용하면 된

다.

Page 46: Ssao

뷰 스페이스 노말, 깊이 SSAO

Frustum 좌표를 이용해서 위치를 얻어올 수 있다.

Page 47: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 48: Ssao

뷰 스페이스 노말, 깊이SSAO

Frustum 좌표를 만들어서 쉐이더에 넘겨준다.

Page 49: Ssao

뷰 스페이스 노말, 깊이 SSAO

Quad를 그려줄때 normal에 인덱스값을 넣어준다.

Page 50: Ssao

뷰 스페이스 노말, 깊이SSAO

Vertex Shader에서 아까 구했던 Frustum 좌표를 Pixel Shader로 보내준다.

Page 51: Ssao

뷰 스페이스 노말, 깊이 SSAO

현재 픽셀에 해당하는 뷰 공간 위치를 얻어온다.

랜덤 벡터를 만들어 낸다.

* offset 벡터를 구하는 부분은 위의 내용과 같다.

Page 52: Ssao

뷰 스페이스 노말, 깊이 SSAO

Offset 벡터와 노말의 내적을 구해서 부호를 구한다.

현재 위치에서 부터 차폐를 검사할 벡터를 구한다.

* flip을 곱해줌으로써 반구 방향으로만 계산

Page 53: Ssao

뷰 스페이스 노말, 깊이

SSAO

구한 벡터에 Projection * Texture Projection 행

렬을 곱해서 스크린 좌표를 구한다.

구한 좌표에 해당하는 깊이값을 구하고 깊이값

에 매치가 되는 뷰 공간 좌표를 구한다.

Page 54: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 55: Ssao

뷰 스페이스 노말, 깊이 SSAO

P와 R은 같은 평면상에 있으므로 차폐 계산에서제외시켜야 한다. -> 노말을 이용해서 계산

Page 56: Ssao

뷰 스페이스 노말, 깊이

SSAO

노말과의 내적연산을 해서 그 값을 Occlusion값

에 적용한다. (같은 평면이면 0)

차폐된 값을 구하면 된다.

Page 57: Ssao

뷰 스페이스 노말, 깊이 SSAO

차폐 계산에 대해서 Eipsilon 값을 두어서 특정 거리는 계산에서 제외시키고 차폐를 계산할 거리의범위를 두어서 선형적으로 계산한다. (값의 조절이필요)

Page 58: Ssao

뷰 스페이스 노말, 깊이SSAO

차폐를 계산한 만큼 나눠줘서 차폐 값을 맞춰준다.

차폐된 값을 적절히 변화를 줘서 적용하면 된다.

Page 59: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 60: Ssao

뷰 스페이스 노말, 깊이

SSAO

적절히 계산이 된 것 같기는 하지만 바로 적용

하기에는 부드러워 보이지 않는다.

SSAO를 구현하면 SSAO 맵을 만든 다음 나오

는 부분이 바로 Blur를 적용하는 것이다.

Page 61: Ssao

뷰 스페이스 노말, 깊이SSAO

Blur를 계산할 때 고려해야할 점은

경계부분은 유지를 하면서 (Edge Preserving)

노이즈를 부드럽게 변환시키는 것이다. (Smooth)

노말, 깊이 맵을 참조해서 Blur를 계산할 수 있다.

Page 62: Ssao

뷰 스페이스 노말, 깊이SSAO

핵심 알고리즘만 보면…

현재 픽셀의 노말값과 깊이값을 구해둔다.

샘플링할 픽셀의 노말값과 의 내적과 깊이 차이를 통과한 부분만 샘플링을 함으로써 경계를 유지할 수 있다.

Page 63: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 64: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 65: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 66: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 67: Ssao

뷰 스페이스 노말, 깊이

SSAO

Page 68: Ssao

발전

• SSDO

• HDAO

• HBAO

찾아서 정리하는대로 올리겠습니다. -0-;;

Page 69: Ssao

결론

SSAO는 Ambient Occlusion을 실시간으로 적

용하려는 노력에서 나온 기법중 하나고 점차 발

전해 나가고 있다.

Deferred Rendering등 요즘 트렌드상에서 기본

적으로 노말, 깊이, 위치 맵을 얻어오기 때문에

적용하기 어렵지는 않을 것이다.

Page 70: Ssao

결론

게임에 따라서 적용했을 때 효과가 있는 프로젝

트가 있고 아닌 프로젝트가 있을 것이다. 상황

에 따라서 성능비가 그렇게 높지 않을 수 있으

니 무조건 사용하겠다는 생각은 버리는게 좋겠

다.

정적인 오브젝트가 많다면 라이트맵을 적용하

는게 퀄리티도 좋고 빠를것이다.

Page 72: Ssao