본문 바로가기

프로그래밍/Shader

Adaptation 구현 과정

Adaptation은 이론에도 나와있듯이 사람이 어두운 곳에 있다가 밝은 곳으로 나오면서 

눈이 서서히 적응하게 되는 효과를 말한다.

 

Adaptation을 구현하려면 먼저 HDR이 구현되어야 한다.

 

Adaptation을 구현하기 위해서는 리소스를 저장할 Buffer 3개, Input을 위한 ShaderResourceView 3개, Output을 위한UnorderedAccessView 3개가 필요하다

픽셀을 DownScale 하기 위해 다음과 같은 Description을 가진 Buffer, ShaderResourceView, UnorderedAccessView를 만들어준다.

DownScale에 필요한 Buffer, ShaderResourcView, UnorderedAccessView

그리고 DownScale에서 구한 현재 프레임의 평균 휘도를 가지고 Adaptation을 해주기 위해 다음과 같은 Description을 가진 Buffer, ShaderResourceView, UnorderedAccessView를 만들어준다.

 

Buffer의 ByteWidth가 sizeof(float)인 이유는 DownScale을 거친 평균 휘도는 float 하나 짜리로 나오기 때문이다.

 

First Pass에서 현재 프레임의 평균 휘도를 구해준다.

 

DownScale을 거친 평균 휘도를 UnorderedAccessView인 AverageLum2에 저장한다.

이 평균 휘도는 Wirte가 가능한 UnorderedAccessView로 뽑아주고 이 값을 Second Pass에서 사용한다.

 

Second Pass에서는 Adaptation이 실행 중일 때 이전 프레임현재 프레임평균 휘도Adaptation 계수를 가지고 선형 보간을 해준다.

 

선형 보간한 평균 휘도를 UnorderedAccessView인 AverageLum2에 넣어준다.

 

다음 Pixel Shader에서 방금 구한 평균 휘도를 가지고 Tone Mapping을 해준다.

 

AvgLum에 평균 휘도를 넣어주고 ToneMapping을 한다

그리고 Adaptation 계수는 상수버퍼로 만들어서 Compute Shader에 넘겨주어야 하는데

구하는 식은 다음과 같다.

 

Adaptation 계수를 구하는 방식

처음 시작하면 이전 프레임이 없기 때문에 0으로 세팅해준다

지금 코드는 Adaptation이 3초에 한번씩 실행하게 해주는 코드이다.

 

m_fAdapt는 Adaptation이 실행될 시간이다. 즉, 3초

m_fElapsedTime / m_fAdapt가 계수를 구해주는 식인데

시간이 0부터 3초까지 흐르는 시간을 실행될 시간으로 나누어주면 선형보간을 통해

완전 하얀 화면에서 점점 원래의 화면으로 변하게 된다.

 

실시간으로 현재 프레임의 Buffer, UnorderedAccessView, ShaderResourceView를 이전 프레임으로 Swap해준다.

 

이렇게 하면 이전 프레임으로 저장이 된다.

 

 

'프로그래밍 > Shader' 카테고리의 다른 글

HDR 구현 과정 1부  (0) 2019.06.10
Rim Light 이론과 구현  (0) 2019.04.04
기하 셰이더 (Geometry Shader)  (0) 2019.03.29
Tessellation  (0) 2019.03.20
Adaptation  (0) 2019.03.14