핵심 정리
| 개념 | 의미 |
|---|---|
| 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가 됩니다.
render target은 “지금 쓰는 목적지”라는 역할 이름에 가깝습니다. 같은 texture라도 한 pass에서는 color attachment로 쓰이고, 다음 pass에서는 shader가 읽는 sampled texture가 될 수 있습니다.
depth attachment는 화면에 보이는 색을 저장하지 않지만, depth test의 기준이 됩니다. shadow mapping처럼 depth 자체가 다음 pass의 입력이 되는 경우에는 depth texture가 중요한 render target이 됩니다.
MSAA render target은 sample이 여러 개라 바로 일반 texture처럼 쓰기 어렵습니다. resolve는 여러 sample을 하나의 픽셀 값으로 정리해 후처리나 최종 출력에서 읽을 수 있게 만드는 단계입니다.
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