핵심 정리
| 개념 | 의미 |
|---|---|
| Framebuffer | 렌더링 결과가 기록되는 attachment 묶음 |
| Color attachment | 색 결과를 저장하는 이미지 |
| Depth attachment | 깊이 테스트용 깊이 이미지 |
| Render target | 렌더링 목적지로 쓰는 텍스처나 버퍼 |
| Resolve | MSAA 결과를 일반 텍스처로 정리하는 과정 |
구조
기본 렌더링은 화면 back buffer에 바로 그립니다. 렌더 타깃을 쓰면 화면이 아니라 texture 같은 중간 이미지에 먼저 그릴 수 있습니다. 이 중간 결과를 다시 샘플링하면 후처리, 그림자, 반사, G-buffer 같은 기법을 만들 수 있습니다.
scene -> offscreen render target -> texture sample -> final framebufferframebuffer는 하나 이상의 attachment를 묶습니다. color attachment에는 색이, depth attachment에는 깊이가 기록됩니다. 여러 color attachment를 동시에 쓰면 MRT, 즉 multiple render targets가 됩니다.
Attachment
렌더 타깃은 shader에서 읽는 texture와 비슷해 보이지만, 같은 순간에 같은 리소스를 읽고 쓰면 위험합니다. 한 pass에서는 쓰기 대상으로, 다음 pass에서는 읽기 대상으로 사용하는 식으로 역할을 분리해야 합니다.
사용 기준
| 목적 | 렌더 타깃 사용 |
|---|---|
| bloom, color grading | 화면을 texture로 받아 후처리 |
| shadow mapping | light view의 depth map 저장 |
| deferred rendering | G-buffer에 material 정보 저장 |
| minimap, portal | 별도 카메라 결과 저장 |
| picking, ID buffer | 객체 ID를 색 또는 integer attachment에 저장 |
렌더 타깃은 해상도와 포맷이 비용을 좌우합니다. HDR color, high precision normal, depth format, MSAA sample count는 모두 메모리 대역폭과 저장 공간에 영향을 줍니다.
주의할 점
렌더 타깃을 많이 쓰면 GPU 메모리와 bandwidth 비용이 빠르게 커집니다. 특히 full-resolution HDR texture 여러 장은 후처리보다 저장과 읽기 비용이 더 큰 병목이 될 수 있습니다.
또 color attachment와 depth attachment의 크기, sample count, format 호환성이 맞지 않으면 framebuffer가 완전하지 않은 상태가 될 수 있습니다.
참고 링크
2 sources