PART 5 - 강의 1/5

VSM 아키텍처

16k 가상 해상도, 128x128 페이지, 온디맨드 렌더링

01

기존 vs VSM

Cascaded Shadow Maps Virtual Shadow Maps
고정 해상도 16k x 16k 가상 해상도
전체 맵 렌더링 온디맨드 페이지 렌더링
거리별 품질 저하 일관된 고품질
Nanite와 비호환 Nanite 최적화
02

페이지 아키텍처

페이지 구조 // 페이지 구조 PageSize = 128 x 128 pixels VirtualResolution = 16384 x 16384 (16k) // 페이지 할당 // - 깊이 버퍼 분석 기반 // - 화면에 보이는 픽셀에 필요한 페이지만 할당/렌더링 // - 프레임 간 캐싱
16k
Virtual Resolution
128px
Page Size
03

물리 페이지 풀

메모리 관리와 페이지 할당

VSM은 물리 페이지 풀에 실제 섀도우 데이터를 저장합니다. 가상 해상도는 16k이지만, 실제로 렌더링되는 페이지만 물리 메모리를 사용합니다.

페이지 풀 설정 // 물리 페이지 풀 크기 r.Shadow.Virtual.MaxPhysicalPages = 4096 // 기본값 // 메모리 계산: 4096 pages x 128x128 x 4bytes = ~256MB // 풀 부족 징후: 체커보드 패턴 발생 // 해결: MaxPhysicalPages 증가 또는 라이트 수 감소 // 페이지 풀 시각화 r.Shadow.Virtual.Visualize = 1
체커보드 패턴

그림자에 체커보드 패턴이 보이면 물리 페이지 풀이 부족하다는 신호입니다. r.Shadow.Virtual.MaxPhysicalPages를 증가시키거나 동시에 활성화되는 섀도우 라이트 수를 줄이세요.

04

Nanite와의 시너지

왜 VSM에 Nanite가 필수인가

VSM은 Nanite와 함께 사용하도록 설계되었습니다. Non-Nanite 지오메트리는 VSM에서 심각한 성능 문제를 유발합니다.

Nanite + VSM 시너지
  • Nanite: GPU-Driven으로 섀도우 페이지를 효율적으로 렌더링
  • Non-Nanite: CPU Draw Call 기반으로 페이지당 개별 렌더링 필요
  • 결과: Non-Nanite 메시가 있으면 VSM 비용이 급증
핵심 원칙

모든 Static Mesh에 Nanite를 활성화하세요. Non-Nanite 메시 하나가 수천 개의 VSM 페이지를 개별 렌더링하게 만들어 전체 섀도우 성능을 저하시킵니다.

SUMMARY

핵심 요약

  • VSM은 16k 가상 해상도의 고품질 섀도우 시스템
  • 128x128 페이지 단위로 온디맨드 렌더링
  • 물리 페이지 풀 부족 시 체커보드 패턴 발생
  • Non-Nanite 메시는 VSM 성능의 주적
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: VSM 시각화

r.Shadow.Virtual.Visualize = 1로 VSM 페이지 할당을 시각화하고, 카메라를 이동하면서 온디맨드 페이지 렌더링이 어떻게 동작하는지 관찰하세요.

실습 2: Non-Nanite 영향 테스트

씬에 Non-Nanite Static Mesh를 추가/제거하면서 stat ShadowRendering의 비용 변화를 비교하세요. Nanite 활성화 전후의 VSM 렌더링 시간 차이를 기록하세요.

심화 과제

r.Shadow.Virtual.MaxPhysicalPages를 의도적으로 512로 낮춰 페이지 풀 부족 상황을 만들고, 체커보드 패턴을 확인하세요. 그 후 적절한 값을 찾아 문제를 해결하고, 메모리 사용량과 품질의 최적점을 도출하세요.