Adaptation은 이론에도 나와있듯이 사람이 어두운 곳에 있다가 밝은 곳으로 나오면서
눈이 서서히 적응하게 되는 효과를 말한다.
Adaptation을 구현하려면 먼저 HDR이 구현되어야 한다.
Adaptation을 구현하기 위해서는 리소스를 저장할 Buffer 3개, Input을 위한 ShaderResourceView 3개, Output을 위한UnorderedAccessView 3개가 필요하다
픽셀을 DownScale 하기 위해 다음과 같은 Description을 가진 Buffer, ShaderResourceView, UnorderedAccessView를 만들어준다.
그리고 DownScale에서 구한 현재 프레임의 평균 휘도를 가지고 Adaptation을 해주기 위해 다음과 같은 Description을 가진 Buffer, ShaderResourceView, UnorderedAccessView를 만들어준다.
Buffer의 ByteWidth가 sizeof(float)인 이유는 DownScale을 거친 평균 휘도는 float 하나 짜리로 나오기 때문이다.
First Pass에서 현재 프레임의 평균 휘도를 구해준다.
이 평균 휘도는 Wirte가 가능한 UnorderedAccessView로 뽑아주고 이 값을 Second Pass에서 사용한다.
Second Pass에서는 Adaptation이 실행 중일 때 이전 프레임과 현재 프레임의 평균 휘도를 Adaptation 계수를 가지고 선형 보간을 해준다.
다음 Pixel Shader에서 방금 구한 평균 휘도를 가지고 Tone Mapping을 해준다.
그리고 Adaptation 계수는 상수버퍼로 만들어서 Compute Shader에 넘겨주어야 하는데
구하는 식은 다음과 같다.
처음 시작하면 이전 프레임이 없기 때문에 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 |