본문 바로가기

프로그래밍/Shader

HDR 이론

포스트 프로세싱
 : 조명이 적용된 3D 씬에 2D 이펙트를 적용해 화면에 최종적으로 출력되는 이미지를 개선하는 작업

LDR (Low Dynamic Range) 렌더링
 : 8비트 채널 텍스처, 모든 출력 값이 0 ~ 1 사이의 범위로 고정된다

Saturation
 : 값을 0 ~ 1로 고정해주는 Clamp 역할

밝은 씬에 조명을 비추면 저장해야 하는 조명 값은 LDR의 최대값인 1을 넘어서게 된다. 고정 범위 때문에 밝은 부분의 디테일은 날아가게 된다. LDR 텍스처의 저장 범위가 포화되기 때문이다.
마찬가지로 어두운 씬은 낮은 값에서 동일한 효과를 일으킨다

휘도 (Luminance)
 : 특정 방향에서 표면으로부터의 단위지역당 빛의 정도. 색의 밝고 어두운 정도를 말한다.

톤 매핑 (Tone Mapping)
 : 1로 고정되지 않는 텍스처 포맷에 씬의 조명 값을 저장하는 것. Middle Grey, White 두 매개변수를 기준으로 HDR의 스케일을 조정한다

HDR (High Dynamic Range) 렌더링
 : 톤 매핑을 사용해서 스크린의 LDR 범위에 매핑한다. 디테일을 가능한 한 적게 손실되게 만들 수 있다.


MG = Middle Grey, A = AverageLum, LS = LScale, W = White
CLS = LDR로 변환하기 위한 HDR 색상 휘도 스케일

위 공식은 픽셀의 휘도 값을 원하는 중간 휘도 값으로 스케일을 조정한다.
그리고 [0,1] 사이의 범위 값으로 다시 스케일을 조정한다
어느 값을 흰색으로 잡느냐와, 중간 회색을 어느 값으로 잡느냐에 따라 HDR의 LDR변환 스케일을 결정할 수 있다.

HDR 단계
평균 휘도 값을 기준으로 휘도를 다운스케일하는 단계와 톤 매핑을 위한 최종 패스 단계이다

컴퓨트 셰이더를 생성하는 과정에서 픽셀 셰이더를 사용해 휘도를 다운스케일하는 작업이 이뤄진다

각 단계마다 입력 값 대비 1/4로 스케일을 줄여 최종적으로는 하나의 픽셀에 다운스케일하게 된다.

컴퓨트 셰이더는 공유 메모리를 지원하고, 동시에 여러 스레드를 실행한다

공유 메모리
 : 같은 그룹으로 묶인 모든 스레드가 빠르게 접근할 수 있게 설계된 메모리 영역

첫번째 컴퓨트 셰이더는 HDR 값을 1/16 크기로 다운스케일한다.  얻어진 이미지를 다른 후처리 과정에서 사용하기 때문이다.
첫번째 다운스케일이 끝나면 휘도 인자를 통해 픽셀 색상을 해당하는 휘도 값으로 변환한다

각 스레드에서 계산된 휘도 값을 사용해 계속 1/4씩 줄여나가는 과정을 반복하면 최종적으로는 하나의 픽셀로 다운스케일이 이뤄진다. 각 과정에서 3/4의 스레드는 다운스케일 연산을 수행하지 않고, 남은 스레드가 해당 스레드의 값을 합해 저장한다.
이 과정에 끝나면 다음 과정이 수행되기 전에 스레드를 동기화한다. 

스레드 그룹이 각각 모든 픽셀에 대해 다운스케일을 완료하면 이 값들의 평균을 구해 다음 컴퓨트 셰이더에 저장한다

두번째 컴퓨트 셰이더는 넘어온 중간 결과를 다시 다운스케일해 최종 평균 휘도 값을 구한다.
하나의 스레드 그룹만 사용하면 되므로, 처음 컴퓨트 셰이더와 동일한 방식으로 평균 휘도를 구한다.
평균 휘도를 양수 값을 취해야 한다

평균 휘도를 구한 후, 톤 매핑을 수행하기 위해 FullScreenQuad를 실행한다.
픽셀 셰이더는 HDR 값을 LDR로 스케일 조정하기 위한 공식을 동일하게 사용한다.

Middle Grey와 White 값은 씬의 모습에 따라 ,날씨에 따라, 혹은 낮과 밤에 따라 다르게 설정해야 한다.

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

Adaptation  (0) 2019.03.14
Bloom 이론  (0) 2019.03.13
Compute Shader_3  (0) 2019.02.10
Compute Shader_2  (0) 2019.02.09
Compute Shader_1  (0) 2019.02.08