UE5 렌더링 파이프라인
Unreal Engine 5는 Nanite(가상화 마이크로폴리곤)와 Lumen(완전 동적 글로벌 일루미네이션)을 중심으로 렌더링 파이프라인을 전면 재설계했습니다.
렌더 패스 구조 개요
섹션 제목: “렌더 패스 구조 개요”UE5의 프레임 렌더링은 크게 다음 단계로 진행됩니다.
PrePass (Depth Prepass) └─ Nanite RasterizationBasePass (GBuffer 기록) └─ Deferred ShadingLighting Pass └─ Lumen (GI + Reflection)Translucency PassPost Processing └─ TAA / TSR, Bloom, Tone MappingNanite
섹션 제목: “Nanite”Nanite는 폴리곤 수에 관계없이 화면 픽셀 해상도에 맞게 자동으로 LOD를 처리하는 가상화 지오메트리 시스템입니다.
작동 원리
섹션 제목: “작동 원리”- 메시를 클러스터(128 트라이앵글 단위)로 분할
- 카메라 거리·화면 크기에 따라 클러스터 단위로 컬링·레스터화
- GPU 기반 소프트웨어 래스터라이저로 매우 작은 트라이앵글 처리
활성화 조건
섹션 제목: “활성화 조건”// StaticMesh 에셋 → Details → Nanite Settings → Enable Nanite Support 체크// 또는 C++에서UStaticMesh* Mesh = ...;Mesh->NaniteSettings.bEnabled = true;Nanite 제약사항
섹션 제목: “Nanite 제약사항”| 항목 | 지원 여부 |
|---|---|
| Deferred Shading | ✅ |
| 월드 포지션 오프셋(WPO) | ✅ (UE 5.1+) |
| 스켈레탈 메시 | ❌ |
| 반투명 머티리얼 | ❌ |
| 커스텀 뎁스 | 제한적 |
Lumen
섹션 제목: “Lumen”Lumen은 레이 트레이싱 전용 하드웨어 없이 소프트웨어 레이 트레이싱으로 완전 동적 GI와 반사를 구현합니다.
두 가지 레이 트레이싱 모드
섹션 제목: “두 가지 레이 트레이싱 모드”| 모드 | 특징 | 권장 플랫폼 |
|---|---|---|
| Software Ray Tracing | Mesh Distance Field 기반 | 콘솔·중간 사양 PC |
| Hardware Ray Tracing | RT 코어 활용, 고품질 | 고사양 PC |
C++에서 Lumen 설정
섹션 제목: “C++에서 Lumen 설정”// 런타임에 Lumen GI 품질 조정static IConsoleVariable* CVarLumenQuality = IConsoleManager::Get().FindConsoleVariable(TEXT("r.Lumen.DiffuseIndirect.Allow"));
if (CVarLumenQuality) CVarLumenQuality->Set(1); // 0: 비활성, 1: 활성PostProcessVolume을 통한 품질 제어
섹션 제목: “PostProcessVolume을 통한 품질 제어”APostProcessVolume* PPV = ...;PPV->Settings.bOverride_DynamicGlobalIlluminationMethod = true;PPV->Settings.DynamicGlobalIlluminationMethod = EDynamicGlobalIlluminationMethod::Lumen;PPV->Settings.bOverride_LumenSceneLightingQuality = true;PPV->Settings.LumenSceneLightingQuality = 1.0f; // 0.25 ~ 4.0Deferred Shading & GBuffer
섹션 제목: “Deferred Shading & GBuffer”UE5는 기본적으로 Deferred Shading을 사용합니다. BasePass에서 GBuffer에 씬 정보를 기록하고, Lighting Pass에서 조명을 계산합니다.
| GBuffer 채널 | 내용 |
|---|---|
| A | World Normal |
| B | Metallic·Specular·Roughness |
| C | Base Color |
| D | 커스텀 데이터 (서브서피스 등) |
TSR (Temporal Super Resolution)
섹션 제목: “TSR (Temporal Super Resolution)”UE5에서 TAA를 대체하는 업스케일링 기술입니다. 저해상도로 렌더링 후 고해상도로 복원해 성능을 절약합니다.
; DefaultEngine.ini[/Script/Engine.RendererSettings]r.AntiAliasingMethod=4 ; 4 = TSRr.ScreenPercentage=67 ; 67% 해상도로 렌더 후 업스케일프로파일링
섹션 제목: “프로파일링”GPU Visualizer : Ctrl+Shift+, → 패스별 GPU 시간 확인RenderDoc : 외부 프레임 캡처 도구stat GPU : 콘솔 명령어로 GPU 통계 출력r.Nanite.Visualize cluster : Nanite 클러스터 시각화C++에서 PostProcessVolume 런타임 조정
섹션 제목: “C++에서 PostProcessVolume 런타임 조정”// APostProcessVolume 또는 카메라 매니저에서 런타임 PostProcess 조정void AMyGameMode::SetCombatPostProcess(APostProcessVolume* PPV, bool bInCombat){ if (!PPV) return;
// Bloom 강도 전투 중 강조 PPV->Settings.bOverride_BloomIntensity = true; PPV->Settings.BloomIntensity = bInCombat ? 1.5f : 0.675f;
// 색수차 — 피격 시 강조 효과 PPV->Settings.bOverride_SceneFringeIntensity = true; PPV->Settings.SceneFringeIntensity = bInCombat ? 3.0f : 0.0f;
// Vignette — 긴장감 연출 PPV->Settings.bOverride_VignetteIntensity = true; PPV->Settings.VignetteIntensity = bInCombat ? 0.5f : 0.4f;}
// 플레이어별 PostProcess 머티리얼 적용void AMyPlayerController::ApplyHitEffect(UMaterialInterface* HitMaterial){ if (APlayerCameraManager* PCM = PlayerCameraManager) { PCM->AddOrUpdateBlendable(HitMaterial, 1.0f);
// 0.3초 후 제거 FTimerHandle Handle; GetWorldTimerManager().SetTimer(Handle, [this, HitMaterial]() { PlayerCameraManager->RemoveBlendable(HitMaterial); }, 0.3f, false); }}GBuffer 채널 활용
섹션 제목: “GBuffer 채널 활용”| GBuffer | 내용 | 활용 예 |
|---|---|---|
| A | World Normal | SSAO, Lumen Surface Cache |
| B | Metallic·Specular·Roughness | PBR 조명 계산 |
| C | Base Color | 색상 반영 |
| D.r | Custom Data 0 | Subsurface Curvature, 눈 Iris Mask |
| D.g | Custom Data 1 | 투명도, Hair Depth |
// 런타임에 GBuffer 채널 시각화 전환static IConsoleVariable* CVarVis = IConsoleManager::Get().FindConsoleVariable( TEXT("r.BufferVisualizationOverviewTargets"));if (CVarVis){ // 공백 구분 목록으로 시각화 채널 지정 CVarVis->Set(TEXT("BaseColor WorldNormal Roughness CustomDepth"));}