VSM 아키텍처
16k 가상 해상도, 128x128 페이지, 온디맨드 렌더링
기존 vs VSM
| Cascaded Shadow Maps | Virtual Shadow Maps |
|---|---|
| 고정 해상도 | 16k x 16k 가상 해상도 |
| 전체 맵 렌더링 | 온디맨드 페이지 렌더링 |
| 거리별 품질 저하 | 일관된 고품질 |
| Nanite와 비호환 | Nanite 최적화 |
페이지 아키텍처
// 페이지 구조
PageSize = 128 x 128 pixels
VirtualResolution = 16384 x 16384 (16k)
// 페이지 할당
// - 깊이 버퍼 분석 기반
// - 화면에 보이는 픽셀에 필요한 페이지만 할당/렌더링
// - 프레임 간 캐싱
물리 페이지 풀
메모리 관리와 페이지 할당
VSM은 물리 페이지 풀에 실제 섀도우 데이터를 저장합니다. 가상 해상도는 16k이지만, 실제로 렌더링되는 페이지만 물리 메모리를 사용합니다.
// 물리 페이지 풀 크기
r.Shadow.Virtual.MaxPhysicalPages = 4096 // 기본값
// 메모리 계산: 4096 pages x 128x128 x 4bytes = ~256MB
// 풀 부족 징후: 체커보드 패턴 발생
// 해결: MaxPhysicalPages 증가 또는 라이트 수 감소
// 페이지 풀 시각화
r.Shadow.Virtual.Visualize = 1
그림자에 체커보드 패턴이 보이면 물리 페이지 풀이 부족하다는 신호입니다. r.Shadow.Virtual.MaxPhysicalPages를 증가시키거나 동시에 활성화되는 섀도우 라이트 수를 줄이세요.
Nanite와의 시너지
왜 VSM에 Nanite가 필수인가
VSM은 Nanite와 함께 사용하도록 설계되었습니다. Non-Nanite 지오메트리는 VSM에서 심각한 성능 문제를 유발합니다.
- Nanite: GPU-Driven으로 섀도우 페이지를 효율적으로 렌더링
- Non-Nanite: CPU Draw Call 기반으로 페이지당 개별 렌더링 필요
- 결과: Non-Nanite 메시가 있으면 VSM 비용이 급증
모든 Static Mesh에 Nanite를 활성화하세요. Non-Nanite 메시 하나가 수천 개의 VSM 페이지를 개별 렌더링하게 만들어 전체 섀도우 성능을 저하시킵니다.
핵심 요약
- VSM은 16k 가상 해상도의 고품질 섀도우 시스템
- 128x128 페이지 단위로 온디맨드 렌더링
- 물리 페이지 풀 부족 시 체커보드 패턴 발생
- Non-Nanite 메시는 VSM 성능의 주적
도전 과제
배운 내용을 직접 실습해보세요
r.Shadow.Virtual.Visualize = 1로 VSM 페이지 할당을 시각화하고, 카메라를 이동하면서 온디맨드 페이지 렌더링이 어떻게 동작하는지 관찰하세요.
씬에 Non-Nanite Static Mesh를 추가/제거하면서 stat ShadowRendering의 비용 변화를 비교하세요. Nanite 활성화 전후의 VSM 렌더링 시간 차이를 기록하세요.
r.Shadow.Virtual.MaxPhysicalPages를 의도적으로 512로 낮춰 페이지 풀 부족 상황을 만들고, 체커보드 패턴을 확인하세요. 그 후 적절한 값을 찾아 문제를 해결하고, 메모리 사용량과 품질의 최적점을 도출하세요.