GPU-Driven 렌더링
GPU Scene 아키텍처와 컬링 파이프라인을 이해합니다
렌더링 패러다임의 진화
Fixed Function에서 GPU-Driven까지
1990s -> Programmable
2000s -> Deferred
2010s -> GPU-Driven
2020s
GPU-Driven 렌더링은 CPU의 역할을 최소화하고 GPU가 렌더링 결정(컬링, LOD 선택, 드로우 콜 생성)을 직접 수행하는 패러다임입니다.
전통적 렌더링에서 CPU는 각 오브젝트마다 드로우 콜을 발행합니다. GPU-Driven에서는 GPU가 전체 씬 데이터를 가지고 자체적으로 무엇을 렌더링할지 결정합니다.
GPU Scene 아키텍처
전체 씬을 GPU 메모리에 유지
Nanite는 전체 씬을 GPU에 유지합니다. 이를 통해 CPU-GPU 동기화를 최소화하고, 단일 Draw Indirect로 전체 씬을 래스터화할 수 있습니다.
// GPU Scene 구조 (개념적)
struct FGPUScene {
InstanceList[]; // 모든 인스턴스 데이터
GeometryBuffer[]; // 가상화된 지오메트리
MaterialData[]; // 머티리얼 파라미터
TransformBuffer[]; // 변환 행렬
};
- CPU-GPU 동기화 최소화 - 프레임당 데이터 전송 감소
- 단일 Draw Indirect - 전체 씬 래스터화 가능
- 인스턴스 수 독립적 - 오브젝트 수에 관계없이 일정한 CPU 비용
- 동적 업데이트 - 변경된 인스턴스만 부분 업데이트
컬링 파이프라인
다단계 GPU 컬링으로 효율적 렌더링
Main Pass: 이전 프레임 HZB(Hierarchical Z-Buffer)를 사용하여 컬링
Post Pass: 현재 프레임 HZB로 새로 보이게 된 지오메트리 추가 렌더링
// HZB 기반 오클루전 컬링
r.Nanite.OcclusionCulling = 1 // 기본 활성화
// 프로파일링용
r.Nanite.ShowStats = 1 // 컬링 통계 표시
Draw Indirect
GPU가 직접 드로우 콜 파라미터 결정
Draw Indirect는 GPU가 드로우 콜의 파라미터(인스턴스 수, 버텍스 수 등)를 직접 생성하는 기법입니다. CPU는 "드로우하라"는 명령만 내리고, 세부 사항은 GPU가 결정합니다.
Async Compute 활용
GPU 리소스의 효율적 활용
Nanite는 Async Compute를 활용하여 그래픽스 파이프라인과 병렬로 컴퓨트 작업을 수행합니다.
// Async Compute 관련 설정
r.Nanite.AsyncRasterization = 1 // 비동기 래스터화
r.Nanite.Streaming.AsyncCompute = 1 // 비동기 스트리밍
Async Compute는 대부분의 경우 활성화하는 것이 좋습니다. 그래픽스 큐가 바쁜 동안 컴퓨트 큐에서 Nanite 처리를 병렬로 수행할 수 있습니다.
핵심 요약
- GPU-Driven 렌더링은 CPU 병목을 제거하고 GPU가 렌더링 결정을 직접 수행
- GPU Scene에 전체 씬 데이터를 유지하여 CPU-GPU 동기화 최소화
- 다단계 컬링 (Frustum, Backface, Small Feature, Occlusion)으로 효율적 처리
- Two-Pass HZB 오클루전 컬링으로 가려진 지오메트리 제거
- Draw Indirect로 단일 드로우 콜에 전체 씬 렌더링
- Async Compute로 그래픽스/컴퓨트 병렬 처리
도전 과제
배운 내용을 직접 실습해보세요
r.Nanite.ShowStats = 1을 활성화하고 다양한 카메라 앵글에서 Frustum Culled, Occluded, Visible 클러스터 수의 변화를 관찰하세요. 벽 뒤에 오브젝트를 배치하여 HZB 오클루전 컬링이 제대로 동작하는지 확인하세요.
동일한 씬에서 Nanite 메시와 Non-Nanite 메시를 번갈아 사용하면서 stat SceneRendering으로 Draw Call 수를 비교하세요. Nanite가 단일 Draw Indirect로 씬을 렌더링하는 것을 확인하세요.
r.Nanite.AsyncRasterization을 0과 1로 전환하면서 ProfileGPU로 그래픽스 큐와 컴퓨트 큐의 타임라인을 비교 분석하세요. Async Compute가 실제로 GPU 활용률을 얼마나 개선하는지 수치로 확인하세요.