빠른 흐름
linear lighting
-> HDR color buffer
-> exposure
-> tone mapping
-> output transform
-> display| 단계 | 역할 |
|---|---|
| HDR buffer | 1보다 큰 조명 값을 보존 |
| Exposure | 장면 밝기 기준을 이동 |
| Tone mapping | 넓은 밝기 범위를 LDR로 압축 |
| 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를 천천히 바꿉니다. 변화 속도가 너무 빠르면 화면이 펌핑되는 것처럼 보이고, 너무 느리면 어두운 곳과 밝은 곳을 오갈 때 반응이 답답해집니다.
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 이후에 만들면 밝은 영역 정보가 부족할 수 있습니다.
주의할 점
HDR 파이프라인은 색 공간과 함께 봐야 합니다. 조명은 linear에서 계산하고, tone mapping 이후 display 출력 변환을 적용해야 합니다.
노출과 tone mapping을 잘못 배치하면 장면이 전체적으로 씻겨 보이거나, 흰색 영역이 너무 빨리 포화되거나, bloom이 과하게 번질 수 있습니다.
참고 링크
1 sources