핵심 정리
| 저장 후보 | 용도 | 비용 |
|---|---|---|
| Albedo | 기본 색 | 낮음 |
| Normal | 조명 방향 계산 | 정밀도 중요 |
| Roughness/metallic | PBR 재질 | packing 가능 |
| Depth | position 복원 | depth buffer 재사용 가능 |
| Material ID | shader variant 선택 | 분기 비용 주의 |
| Motion vector | TAA, motion blur | 추가 attachment 필요 |
geometry pass
-> albedo + normal + material params + depth
-> lighting pass
-> shaded image구조
G-buffer는 deferred rendering의 geometry pass에서 만든 여러 render target 묶음입니다. 조명 pass는 G-buffer를 읽어 화면 공간에서 조명을 계산합니다. 그래서 G-buffer에 무엇을 저장하느냐가 deferred renderer의 품질과 비용을 결정합니다.
Position을 그대로 저장할 수도 있지만, 보통 depth와 inverse projection으로 view position을 복원하는 방식이 더 많이 쓰입니다. position attachment 하나를 줄이면 bandwidth와 메모리를 아낄 수 있습니다.
depth + screen uv
-> inverse projection
-> view/world position 복원Normal은 조명 품질에 큰 영향을 줍니다. 3개의 float를 그대로 저장하면 비용이 크므로, view-space normal을 2채널로 encoding하거나 10:10:10:2 같은 packed format을 검토합니다.
packing
roughness, metallic, ambient occlusion, material flags처럼 범위가 작은 값은 한 texture의 채널에 packing할 수 있습니다. packing은 attachment 수를 줄이지만, format 제약과 precision 손실을 함께 만듭니다.
RGBA8 material texture
R: roughness
G: metallic
B: ambient occlusion
A: material flags or unused선택 기준
| 조건 | 설계 |
|---|---|
| bandwidth가 민감 | attachment 수와 bit depth 줄임 |
| normal artifact가 보임 | normal format 정밀도 상향 |
| PBR material 다양함 | material parameter packing |
| TAA 필요 | motion vector 별도 저장 |
| 투명 물체 중요 | G-buffer 밖 forward pass |
| material별 shader가 크게 다름 | material ID와 pass 분리 검토 |
G-buffer는 "나중에 필요할지도 모르는 값"을 모두 저장하는 곳이 아닙니다. 조명 pass와 후처리에서 실제로 쓰는 값만 남겨야 합니다.
주의할 점
G-buffer는 full-resolution render target 여러 장을 매 프레임 읽고 쓰기 때문에 bandwidth 병목이 되기 쉽습니다. attachment 하나를 추가하는 결정은 shader 코드 한 줄보다 비용이 큽니다.
또 G-buffer에 저장하지 않은 정보는 lighting pass에서 복원할 수 없습니다. 투명도, 복잡한 subsurface, hair, layered material은 별도 forward pass나 전용 buffer가 필요할 수 있습니다.
참고 링크
1 sources