빠른 흐름
scene render
-> HDR render target
-> post-process passes
-> tone mapping
-> gamma/output transform
-> display| 효과 | 보통 필요한 입력 |
|---|---|
| Bloom | 밝은 영역 추출, blur |
| Tone mapping | HDR color buffer |
| Color grading | 최종 색 또는 LUT |
| Depth of field | color + depth |
| SSAO | depth + normal |
| Motion blur | color + motion vector |
구조
후처리는 이미 그려진 장면 이미지를 다시 처리하는 화면 공간 기법입니다. 장면을 바로 화면에 그리지 않고 렌더 타깃에 먼저 저장한 뒤, fullscreen triangle이나 quad를 그리며 fragment shader에서 이미지를 샘플링합니다.
input texture -> post shader -> output render target여러 후처리를 연결하면 pass graph가 됩니다. 각 pass는 입력 texture를 읽고 새 render target에 씁니다. 같은 texture를 동시에 읽고 쓰는 구조는 피해야 합니다.
Bloom은 밝은 픽셀만 추출해 blur한 뒤 원본에 더합니다. Color grading은 LUT나 색 변환으로 최종 인상을 조정하고, depth of field는 depth를 기준으로 초점 밖 영역을 흐리게 만듭니다.
SSAO는 depth와 normal을 이용해 주변이 막힌 접촉부를 어둡게 하는 화면 공간 visibility 근사입니다. Motion blur는 현재 프레임 색만으로 충분하지 않아 물체나 카메라 움직임을 담은 motion vector가 필요합니다.
HDR와 tone mapping
HDR 렌더 타깃은 1보다 큰 밝기 값을 저장할 수 있습니다. tone mapping은 이 넓은 밝기 범위를 display에 맞는 LDR 범위로 압축합니다. gamma/output 변환은 tone mapping 이후 단계에 위치하는 경우가 많습니다.
순서 기준
| 처리 | 일반적 위치 |
|---|---|
| Scene lighting | HDR buffer |
| Bloom extraction | tone mapping 전 |
| Bloom composite | tone mapping 전 또는 정책에 따라 |
| Tone mapping | display 출력 전 |
| Color grading | tone mapping 전후 파이프라인 정책 |
| UI 합성 | 대개 최종 단계 근처 |
후처리는 순서가 결과를 크게 바꿉니다. bloom을 tone mapping 전에 합성하는지, color grading을 어느 색 공간에서 하는지에 따라 밝기와 색이 달라집니다.
주의할 점
후처리는 전체 화면을 읽고 쓰는 작업이라 bandwidth 비용이 큽니다. full-resolution pass가 많아지면 shader 계산보다 texture read/write가 병목이 될 수 있습니다.
또 color space와 HDR/LDR 경계를 잘못 잡으면 bloom이 과하거나 tone mapping 이후 색이 씻겨 보일 수 있습니다.
참고 링크
2 sources