빠른 흐름
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를 동시에 읽고 쓰는 구조는 피해야 합니다.
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