본문 바로가기

프로그래밍/Shader

Bloom 이론

Bloom
 : HDR에서 비디오카메라를 구현할 때 현실감을 주기 위해 흔히 쓰이는 PostEffect이다.
 아주 밝은 픽셀에서 주변의 어두운 픽셀 쪽으로 빛을 흘리는 것
 -> 매우 밝은 픽셀에서 빛이 새어나오는 현상이다.

평균 휘도(Luminance)를 통해 각 픽셀이 주변 픽셀에 얼마나 빛을 흘리는지 계산해야 하므로, HDR 렌더링이 필수적이다.
LDR 값에서 Bloom을 시도하면 마치 그을린 것처럼 빛이 떠버리는 현상이 발생한다

Bloom 처리 과정

HDR 텍스처를 1/16로 다운스케일함으로써 시작된다

다운스케일 하는 이유
  1. 메모리를 덜 사용할 수 있다.
  2. 픽셀 수를 줄임으로써 속도가 더 빨라진다
  3. 풀 해상도에서 사용하면 업스케일 덕분에 블러링 과정에서 추가적으로 성능 향상이 있다.
다운스케일된 이미지는 다른 Effect에도 사용할 수 있으므로 중간 값으로 덮어쓰지 말고 계속 저장하고 있는 것이 좋다.

중간 휘도 계산이 끝난 다운스케일 HDR 텍스처는 Bright Pass 과정에 쓰인다

Bright Pass
 : 주변에 빛을 흘릴 픽셀을 선택하는 과정. 픽셀 필터링은 휘도 값에 의해 이뤄진다

검은색이 아니면서 블룸 효과가 발생할 정도의 밝은 픽셀을 찾아야 한다. 이를 위해 각 픽셀에 대해 휘도 값을 계산한 다음 블룸의 Threshold 값으로 스케일된 평균 휘도를 빼준다.
계산된 픽셀 색상 값의 스케일을 조정한다. 이렇게 하면 평균보다 큰 휘도 값을 갖는 픽셀을 제외하고 모두 검은색으로 나타나게 된다.

Bright Pass를 통과한 값을 임시 버퍼에 저장한 후, 가우시안 블러를 사용해 주변 픽셀에 빛을 흘리는 효과를 구현해야 한다.




입력된 픽셀 값은 가운데에서 가장 크고 멀어질수록 점점 작아지는 식으로 퍼진다

블러 필터를 적용할 때는 특정 모양의 가중치 곡선을 곱해주는데, 이를 커널이라 한다.
이 가중치는 커널의 범위 내에서 입력 값이 어떤 모양으로, 혹은 어떤 크기로 분포하게 되는지 결정한다.
ex) 13x13 크기의 가우시안 필터를 사용하면, 각 픽셀에 대해 13x13=169개의 출력 값이 발생하게 된다.

많은 값을 하나의 필터로 출력하면 성능이 떨어지므로 다단계 가우시안 블러를 수행해야 한다. 필터는 Horizontal, Vertical 의 두 단계로 분리된다.

가중치(Weight) 값은 변하지 않으므로 상수 배열 형식으로 저장하는 것이 편하다. 

각 패스를 필행하면 입력 픽셀 값을 스레드 그룹 공유 메모리로 불러온다. 모든 스레드는 값들을 전부 불러온 뒤에 동기화된다.

입력 값을 불러온 후, 각 스레드는 이를 통해 가중치가 적용된 출력 값을 계산한 후에 모두 더해서 Unordered Access View에 저장한다. 이 기법은 각 스레드가 입력 값에 대해 일일이 출력 값 분포를 계산하는 방법보다 더 효율적이다.

블룸 값에 블러링을 적용한 후에는 최종 패스를 통해 원히 HDR 이미지에 후처리 형식으로 적용해야 한다. 선형 필터를 사용하면 이 블룸 값을 HDR 텍스처 해상도로 업스케일할 수 있다.
업스케일링은 최종 이미지의 HDR 색상 값에 더하기 전에 이뤄져야 한다.

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

Tessellation  (0) 2019.03.20
Adaptation  (0) 2019.03.14
HDR 이론  (0) 2019.03.06
Compute Shader_3  (0) 2019.02.10
Compute Shader_2  (0) 2019.02.09