Quick Flow
linear lighting
-> HDR color buffer
-> exposure
-> tone mapping
-> output transform
-> display| 단계 | 역할 |
|---|---|
| HDR buffer | 1보다 큰 조명 값을 보존 |
| Exposure | 장면 밝기 기준을 이동 |
| Tone mapping | 넓은 밝기 범위를 LDR로 압축 |
| Output transform | display 색 공간에 맞게 변환 |
scene-referred linear HDR -> bloom / lighting composite -> exposure -> tone mapping
-> display-referred output transform -> display구조
HDR은 high dynamic range의 줄임말입니다. 렌더링 중간 결과를 0..1 범위에 바로 잘라 버리지 않고, 태양, 조명, 반사처럼 매우 밝은 값을 더 넓은 범위로 유지합니다.
LDR: 0.0 .. 1.0
HDR: 0.0 .. 1.0 .. 10.0 .. 100.0조명 계산과 bloom 같은 효과는 HDR 값이 남아 있을 때 더 자연스럽습니다. 밝은 영역을 먼저 잃어버리면 나중에 bloom threshold를 잡거나 노출을 조정해도 원래 밝기 차이를 복원할 수 없습니다.
Exposure
exposure는 카메라 노출처럼 전체 장면 밝기의 기준을 옮깁니다. 같은 HDR 값이라도 exposure를 올리면 더 밝게 보이고, 낮추면 어둡게 보입니다.
mappedInput = hdrColor * exposure자동 노출은 화면 평균 밝기나 luminance histogram을 보고 exposure를 천천히 바꿉니다. 변화 속도가 너무 빠르면 화면이 펌핑되는 것처럼 보이고, 너무 느리면 어두운 곳과 밝은 곳을 오갈 때 반응이 답답해집니다.
평균 luminance 하나만으로 exposure를 정하면 화면 대부분을 차지하는 하늘이나 작은 태양이 결과를 과도하게 움직일 수 있습니다. histogram percentile, 최소·최대 exposure, 밝아질 때와 어두워질 때의 adaptation speed를 별도 값으로 두고 camera cut에서는 history를 reset합니다.
Tone mapping
tone mapping은 HDR 색을 display가 표현할 수 있는 범위로 압축합니다. 단순 clamp는 1보다 큰 값을 모두 흰색으로 잘라 버리지만, tone mapping curve는 highlight를 부드럽게 눌러 더 많은 밝기 차이를 남깁니다.
| 방식 | 특징 |
|---|---|
| Clamp | 가장 단순하지만 highlight가 쉽게 날아감 |
| Reinhard | 구현이 단순하고 부드럽게 압축 |
| Filmic | 영화 같은 highlight rolloff에 유리 |
| ACES 계열 | 현대 PBR 파이프라인에서 자주 쓰는 기준 |
tone mapping은 color grading, bloom composite, UI 합성과 순서가 맞아야 합니다. UI까지 tone mapping에 넣으면 의도한 UI 색이 달라질 수 있고, bloom을 LDR 이후에 만들면 밝은 영역 정보가 부족할 수 있습니다.
tone mapping curve 이름만 바꿔서는 결과를 비교할 수 없습니다. white point, exposure, color grading, display output transform이 같은 조건인지 먼저 고정합니다. scene HDR에 합성할 효과와 display 색으로 고정해야 하는 UI를 어느 단계에서 섞는지도 renderer 계약으로 정합니다.
주의할 점
HDR 파이프라인은 색 공간과 함께 봐야 합니다. 조명은 linear에서 계산하고, tone mapping 이후 display 출력 변환을 적용해야 합니다.
노출과 tone mapping을 잘못 배치하면 장면이 전체적으로 씻겨 보이거나, 흰색 영역이 너무 빨리 포화되거나, bloom이 과하게 번질 수 있습니다.
HDR render target은 RGBA8처럼 clamp되는 LDR format이 아니라 필요한 밝기 범위와 filtering을 지원하는 floating-point 또는 적절한 HDR format이어야 합니다. 밝은 값이 buffer write에서 이미 잘렸다면 후단 exposure와 tone mapping은 원래 highlight를 되살릴 수 없습니다.
참고 링크
1 sources