텍스처 최적화
텍스처 스트리밍, Virtual Texture, 채널 패킹, 압축 포맷으로 메모리와 대역폭을 최적화합니다.
텍스처 압축 포맷
용도별 올바른 압축 선택
| 포맷 | 채널 | 품질 | 크기 (1024x1024) | 용도 |
|---|---|---|---|---|
| BC1 (DXT1) | RGB | 중 | ~0.5MB | Base Color (알파 불필요) |
| BC3 (DXT5) | RGBA | 중 | ~1MB | Base Color + Alpha |
| BC5 | RG | 높음 | ~1MB | Normal Map (B는 셰이더에서 복원) |
| BC7 | RGBA | 최고 | ~1MB | 고품질 Base Color, UI |
| BC4 | R | 높음 | ~0.5MB | 그레이스케일 (Height, AO 단독) |
| ASTC | RGBA | 가변 | 가변 | 모바일 (블록 크기로 품질 조절) |
UE5는 Texture Type 설정에 따라 자동으로 적절한 압축 포맷을 선택합니다. Default→BC1/BC3, Normal Map→BC5, Masks→BC4/BC5. 하지만 채널 패킹 텍스처는 수동으로 Compression을 Masks로 변경해야 채널 간 간섭을 방지합니다.
텍스처 스트리밍
메모리 풀 관리와 MIP 레벨
UE5의 텍스처 스트리밍 시스템은 카메라 거리에 따라 텍스처의 MIP 레벨을 동적으로 로드/언로드하여 GPU 메모리를 관리합니다.
// 텍스처 스트리밍 관련 설정
// 스트리밍 풀 크기 설정 (Project Settings)
r.Streaming.PoolSize = 1000 // MB 단위
// 텍스처별 설정 (Texture Details)
Streaming:
Never Stream: false // UI 등 항상 최고 MIP 필요 시 true
LOD Bias: 0 // MIP 레벨 오프셋
LOD Group: TEXTUREGROUP_World
// MIP 레벨 구조:
// MIP 0: 2048x2048 (원본) - 가까울 때
// MIP 1: 1024x1024
// MIP 2: 512x512
// MIP 3: 256x256
// ...점점 작아짐 - 멀 때
스트리밍 풀이 부족하면 텍스처가 흐릿하게(낮은 MIP) 표시됩니다. stat streaming으로 현재 풀 사용량을 확인하고, 필요하면 r.Streaming.PoolSize를 조절하세요. 근본적으로는 텍스처 크기를 줄이는 것이 해결책입니다.
Virtual Texture (VT)
대규모 텍스처의 효율적 관리
Virtual Texture는 실제로 화면에 보이는 부분의 텍스처 데이터만 메모리에 로드하는 시스템입니다. 텍스처 샘플러 제한 문제도 해결합니다.
| VT 유형 | 용도 | 특징 |
|---|---|---|
| Streaming Virtual Texture | 일반 텍스처를 VT로 | 텍스처 에셋을 VT 모드로 변환 |
| Runtime Virtual Texture (RVT) | Landscape, 프로시저럴 | 런타임에 텍스처를 생성/캐싱 |
// Streaming Virtual Texture 활성화
1. Project Settings → Rendering
→ Virtual Textures: Enable
2. 텍스처 에셋 → Details
→ Virtual Texture Streaming: ☑
3. 머티리얼에서 TextureSample 노드
→ Sampler Type: Virtual (자동 전환)
// Runtime Virtual Texture (Landscape용)
1. 레벨에 Runtime Virtual Texture Volume 추가
2. Landscape Material에서 RVT Output 연결
3. 다른 머티리얼에서 RVT Sample로 읽기
// → Landscape와의 블렌딩이 자연스러움
Virtual Texture를 사용하면 여러 텍스처가 하나의 샘플러를 공유합니다. SM5의 16개 샘플러 제한에 걸리는 복잡한 Landscape 머티리얼에서 특히 유용합니다.
텍스처 크기 가이드라인
화면 해상도 대비 적정 텍스처 크기
| 오브젝트 크기/유형 | 권장 텍스처 크기 | 비고 |
|---|---|---|
| 소형 프롭 (컵, 책) | 512x512 ~ 1024x1024 | 화면 점유율 낮음 |
| 중형 가구 | 1024x1024 ~ 2048x2048 | 일반적 |
| 대형 건물/지형 | 2048x2048 ~ 4096x4096 | 타일링으로 해상도 보충 |
| 캐릭터 (1인칭) | 2048x2048 ~ 4096x4096 | 가까이 보이므로 고해상도 |
| UI/HUD | 필요한 만큼 | Never Stream 설정 |
텍스처 크기는 반드시 2의 제곱수(256, 512, 1024, 2048, 4096)를 사용합니다. 비 제곱수 텍스처는 MIP 생성이 안 되고 스트리밍이 불가능합니다.
프로젝트 전체에서 일관된 텍셀 밀도(단위 면적당 텍셀 수)를 유지하는 것이 중요합니다. 일반적으로 512~1024 texels/meter가 데스크톱 기준으로 적합합니다. 뷰포트에서 Texel Density 뷰 모드로 확인할 수 있습니다.
핵심 요약
- 텍스처 유형별 올바른 압축 포맷 선택: Base Color→BC1/BC7, Normal→BC5, Masks→BC4.
- 텍스처 스트리밍은 카메라 거리 기반 MIP 관리로 GPU 메모리를 효율화합니다.
- Virtual Texture는 보이는 영역만 로드하며, 샘플러 제한 문제도 해결합니다.
- Runtime Virtual Texture는 Landscape와 오브젝트 간 자연스러운 블렌딩에 유용합니다.
- 텍스처 크기는 2의 제곱수를 사용하고, 프로젝트 전체에서 텍셀 밀도를 일관되게 유지합니다.
- 채널 패킹(ORM)으로 그레이스케일 맵을 하나의 텍스처로 합쳐 샘플러와 메모리를 절약합니다.
도전 과제
배운 내용을 직접 실습해보세요
동일 텍스처를 BC1(DXT1), BC3(DXT5), BC5, BC7, ASTC 포맷으로 변환하고 메모리 사용량과 시각적 품질을 비교하세요. Normal Map에는 BC5, Base Color에는 BC1이 적합한지 검증하세요.
대형 텍스처(4K 이상)에 Virtual Texture Streaming을 활성화하고, r.VT.Borders 콘솔 명령으로 VT 타일 경계를 확인하세요. VT와 일반 스트리밍의 메모리 사용량을 비교하세요.
r.Streaming.PoolSize와 stat streaming 명령으로 텍스처 스트리밍 풀 상태를 분석하고, Over-budget 텍스처를 찾아 MaxLODSize를 조절하거나 LODBias를 설정하여 메모리 예산 내로 맞추세요.