본문 바로가기

그래픽스

Screen Space Ambient Occlusion( SSAO ) 기법

Screen Space Ambient Occlusion ( SSAO )


SSAO 기법은 Ambient Light 의 계산을 구현하는 기법중에 하나인데,
빛이 인접 물체에 산란, 반사 되어 미치는 빛을 말한다.

빛이 물체에 닿으면 흡수되고 남은 빛을 내뿜는데,
이 빛이 인접 물체에 반사 되어 눈으로 들어오는 것이 Ambient Light 라고 할 수 있다.

쉽게 생각하면 씬에 전역적으로 고르게 분포하는 빛이라고 생각하면 된다.


유니티 등에서 기본적으로 사용되는 라이팅 계산( Standard Shader )에서는

Phong 의 조명 모델이 사용되는데 빛을 매우 근사화 하여 계산한다.  

Phong Shader( Unity standard Shader )

위 그림 처럼 Phong Shader에서는 Ambient Light는 일정한 상수값으로 표현 된다( 매우 간략화  ).

실제로는 물체의 차폐정도( 인접한 곳에 물체가 있는지 )에 따라 Ambient Light의

양이 달라지기 때문에 어둡게 표현 되어야 하는데

이를 Ambient Occlusion 이라고 한다.

 

Ambient Occlusion를 정확히 구현 하기 위해서는

아래 그림의 수식처럼 반구형태의 지점들로부터 들어오는 빛의 양을 누적하여 계산하여야 한다.

 

직접조명( Direct Light )과 달리 주변에 있는 모든 물체를 고려한 계산이 이루어 져야 하기 때문에

근사화 하여 계산하여도 계산량은 상당히 클 수 밖에 없어 게임에서는 정확한 구현이 힘들다.


이에 실시간으로 AO를 간략화 해서 구현하기 위해서 고안된 방법이 SSAO 방식인데
OpenGL, DirectX 등 Fragment Pipeline 형태의 렌더링 방식에서

AO를 실시간에 구현하는 것이 목적이라고 할 수 있다.

http://www.learnopengl.com/#!Advanced-Lighting/SSAO

 

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

Welcome to OpenGL Welcome to the online book for learning OpenGL! Whether you are trying to learn OpenGL for academic purposes, to pursue a career or simply looking for a hobby, this book will teach you the basics, the intermediate, and all the advanced kn

learnopengl.com

 

 

간단하게 아이디어를 설명하자면

물체의 표면에서 일정거리에 있는 랜덤한 지점들에 대해 차폐 검사


위 그림처럼 물체의 표면에서 반구형태의 영역 임의의 지점들이 화면(Screen Space)에서 보이는 영역인지를 검사를 하고
보이는지 않는 영역이 많을 수록 차폐정도가 심한 것으로 판단한다.


총 4번의 Rendering Path가 필요한데 계산과정에서 필요한 데이터를 각각의 버퍼를 생성해서 저장한 뒤 최종적으로 합성하는

디퍼드 렌더링( Defferd Rendering ) 방식이다.


1. Geometry - Buffer Rendering ( G-Buffer )

물체를 그리면서 Nomal, Position, Depth, Texture Color 를 생성한다.

Normal, Position 정보는 눈좌표계의 정보


2. SSAO Process 

물체 표면을 기준으로 구를 생성해서 구 안에 위치한 랜덤한 점들에 대한 차폐 검사를 한다.

화면에서 안보이는 점들이 많을 수록 해당 표면의 점이 차폐정도가 심한것으로 판단.

Depth에 따른 Range 보간이 필요하다.

효율적인 샘플링을 위해 2차 보간방식을 통해 샘플링 지점을 선정하게 되고

Random Rotate Texture를 사용해서 연산량을 줄일 수 있다.


3. Blur SSAO 

2단계에서 생성된 SSAO 정보를 Blur 처리 


4. Final Lighting Rendering
G-Buffer를 바탕으로 라이팅 계산을 하는 과정에서 SSAO를 합성하는 단계

최종 라이팅 계산과정
 

AO

 

유니티 상에서는 URP를 사용한다면 쉽게 구현 할 수 있다.

렌더러 컴포넌트에 SSAO를 추가

렌더러에 컴포넌트를 추가하면 쉽게 구현 가능한데

Intensity는 생성된 AO를 라이팅에 반영할때 곱해지는 값이라고 생각하면 되고

Radius는 AO를 샘플링할때 구의 크기

Sample Count는 샘플링하는 점의 숫자라고 생각하면 된다.

 

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@10.0/manual/post-processing-ssao.html

 

Ambient Occlusion | Universal RP | 10.0.0-preview.26

Ambient Occlusion The Ambient Occlusion effect darkens creases, holes, intersections and surfaces that are close to each other. In the real world, such areas tend to block out or occlude ambient light, so they appear darker. URP implements the real-time Sc

docs.unity3d.com

 

URP를 사용하지 않는다면 에셋스토어에 Standard Asset 에서 SSAO 예제를 확인 할 수 있다.