Files
UE5-Modular-Game-Framework/docs/developer/platform-render-profiles.md
Lefteris Notas dc9c1a6b98 Add DA_RenderPipelineProfile and Platform Render Profiles documentation
- Introduced DA_RenderPipelineProfile data asset to define rendering pipeline configurations for various platforms and quality tiers.
- Documented enums, structs, variables, and default preset tables for render settings.
- Created a comprehensive developer guide for setting up platform-specific render profiles, including file structure, profile creation, and integration with upscalers.
- Included validation rules, console variable references, and testing matrices for ensuring compliance with platform requirements.
2026-05-22 18:10:24 +03:00

384 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Platform Render Profiles — Developer Guide
**Version:** 1.0 | **Target UE:** 5.55.7 | **Systems:** BPC_RenderPipelineManager (149) + DA_RenderPipelineProfile
---
## Purpose
This guide covers setting up per-platform render pipeline configurations in a UE5 project using the Modular Game Framework's render profile system. It explains how to configure Lumen vs baked lighting, Nanite vs traditional LODs, shadow systems, upscalers, and platform-specific constraints — all driven by `DA_RenderPipelineProfile` Data Assets.
---
## Core Concept
UE5's rendering pipeline features (Lumen GI, Nanite, Virtual Shadow Maps) are **not runtime-switchable** — they must be set before the engine initializes or before a level loads. The framework's solution:
1. **Data Asset** (`DA_RenderPipelineProfile`) — Defines render configs per quality tier per platform
2. **Manager** (`BPC_RenderPipelineManager`) — Reads profiles, applies CVars, handles reload requirements
3. **Settings** (`SS_SettingsSystem`) — Persists player's quality choice
4. **UI** (`WBP_SettingsMenu`) — Exposes quality controls with warnings for destructive changes
---
## 1. Creating DA_RenderPipelineProfile Instances
### File Structure
```
Content/Game/DataAssets/RenderProfiles/
├── DA_RPP_PS5.uasset ← PlayStation 5 profile
├── DA_RPP_PS5_Pro.uasset ← PS5 Pro (PSSR support)
├── DA_RPP_PS4.uasset ← PS4 / PS4 Pro
├── DA_RPP_Xbox_Series.uasset ← Xbox Series X|S
├── DA_RPP_Xbox_One.uasset ← Xbox One / One X
├── DA_RPP_PC_High.uasset ← PC: RTX 2000+ / RX 6000+
├── DA_RPP_PC_Low.uasset ← PC: GTX 900-1600 / iGPU
├── DA_RPP_SteamDeck.uasset ← Steam Deck
├── DA_RPP_Switch.uasset ← Nintendo Switch
└── DA_RPP_Switch_2.uasset ← Switch 2 (future)
```
### Profile Creation Walkthrough (PS5 Example)
1. Content Browser → `Content/Game/DataAssets/RenderProfiles/`
2. Right-click → **Miscellaneous → Data Asset**
3. Select class: `DA_RenderPipelineProfile`
4. Name: `DA_RPP_PS5`
5. Open the asset, configure:
**Platform Defaults:**
| Field | Value |
|-------|-------|
| `Platform` | `PS5` |
| `DefaultQualityPreset` | `Medium` |
| `SupportedPipelines` | `[Lumen_GI, Baked_Lightmass, SSGI]` |
| `SupportedUpscalers` | `[TSR, PSSR, FSR]` |
| `MaxResolutionScale` | `1.0` |
| `MaxFPS` | `120` |
| `VRAMBudget_MB` | `14336` |
| `bSupportsNanite` | `true` |
| `bSupportsLumen` | `true` |
| `bSupportsHWRT` | `true` |
**Quality Presets:**
Add 5 entries to the `QualityPresets` map:
| Key (FName) | Config |
|-------------|--------|
| `Low` | GIMethod=Baked, Shadow=CSM, Reflection=Captures, Upscaler=TSR(Perf), Mesh=LOD, Resolution=0.70, FPS=60 |
| `Medium` | GIMethod=Lumen_Low, Shadow=VSM_Low, Reflection=Lumen_Low, Upscaler=TSR(Balanced), Mesh=Nanite, Resolution=0.85, FPS=60 |
| `High` | GIMethod=Lumen_High, Shadow=VSM_High, Reflection=Lumen_High, Upscaler=TSR(Quality), Mesh=Nanite, Resolution=1.0, FPS=60 |
| `Ultra` | GIMethod=Lumen_Ultra, Shadow=VSM_Ultra, Reflection=Lumen_Ultra, Upscaler=PSSR, Mesh=Nanite, Resolution=1.0, FPS=60 |
| `Cinematic` | GIMethod=Lumen+HWRT, Shadow=VSM+RT, Reflection=Lumen+RT, Upscaler=PSSR, Mesh=Nanite, Resolution=1.0, FPS=30 |
**Key detail:** The "Low" preset uses `bRequiresLevelReload = true` because it switches from Lumen→Baked and Nanite→LOD. Medium→High does NOT require reload (both use Lumen+Nanite, only quality differs).
---
## 2. Render Pipeline Method Decision Tree
```
START: Which platform is the player on?
├─ PS5 / Xbox Series / PC_High
│ ├─ Player chooses "Low" → Baked Lightmass + CSM + LOD meshes
│ │ └─ Goal: 60 FPS on base console, 120 FPS on Pro/PC
│ ├─ Player chooses "Medium/High" → Lumen + VSM + Nanite
│ │ └─ Goal: 60 FPS at 85-100% resolution
│ └─ Player chooses "Ultra/Cinematic" → Lumen + HWRT + Nanite + PSSR/DLSS
│ └─ Goal: Max quality, 30-60 FPS
├─ PS4 / Xbox_One
│ └─ ALL presets → Baked Lightmass + CSM + LOD meshes
│ └─ These platforms do NOT support Lumen/Nanite
│ └─ Upscaler: TAAU (built-in, lightweight)
│ └─ Goal: 30 FPS at 60-90% resolution
├─ Switch
│ └─ ALL presets → Baked Lightmass + CSM + ProxyGeometry/LOD
│ └─ Upscaler: NIS (lightweight) or FSR
│ └─ Goal: 30 FPS at 40-70% resolution (docked) / 30 FPS at 30-55% (handheld)
└─ SteamDeck
└─ Low/Medium → Baked/SSGI + CSM + LOD
└─ High → SSGI + CSM + LOD
└─ Upscaler: FSR
└─ Goal: 40-60 FPS at 70-85% resolution
```
---
## 3. Upscaler Integration Guide
### 3.1 Available Upscalers and Requirements
| Upscaler | Plugin Required | Platforms | Quality | Notes |
|----------|----------------|-----------|---------|-------|
| **TSR** (Temporal Super Resolution) | Built-in UE5 | ALL | Good | Default choice. No plugin needed. Works everywhere. |
| **DLSS 3** | NVIDIA DLSS Plugin | PC (RTX 2000+) | Excellent | Best upscaling quality. Frame Gen available on RTX 4000+. |
| **FSR 2/3** | AMD FSR Plugin | ALL (cross-vendor) | Good | Works on all GPUs including consoles and Switch. |
| **PSSR** | PS5 SDK Plugin | PS5 Pro only | Excellent | Hardware-accelerated ML upscaling. PS5 Pro exclusive. |
| **XeSS** | Intel XeSS Plugin | PC (Arc, RTX, RX 6000+) | Very Good | Intel's ML upscaler. Works on Intel Arc + NVIDIA + AMD. |
| **NIS** | NVIDIA Plugin (or built-in) | ALL (cross-vendor) | Acceptable | Lightweight spatial upscaler. Good for Switch/low-end. |
| **TAAU** | Built-in UE5 | ALL | Legacy | Gen-4/Gen-5 TAA upsampling. Fallback for all platforms. |
### 3.2 Setting Up DLSS (PC High Profile)
1. Install the **NVIDIA DLSS** plugin from the UE Marketplace or NVIDIA Developer site
2. Enable in `Edit → Plugins → NVIDIA DLSS`
3. In `DA_RPP_PC_High`:
- Add `DLSS` to `SupportedUpscalers`
- Set default upscaler to `DLSS`
4. Console commands the manager sets when DLSS is active:
```
r.NGX.DLSS.Enable 1
r.NGX.DLSS.Quality {0=UltraPerf, 1=Perf, 2=Balanced, 3=Quality, 4=UltraQuality}
r.NGX.DLSS.DilateMotionVectors 1
r.NGX.DLSS.Reflections 1
r.NGX.DLSS.WaterReflections 1
```
### 3.3 Setting Up FSR 2 (Cross-Platform Profile)
1. Install **AMD FidelityFX FSR 2** plugin
2. Enable in plugins
3. Console commands:
```
r.FidelityFX.FSR2.Enabled 1
r.FidelityFX.FSR2.QualityMode {0=Quality, 1=Balanced, 2=Performance, 3=UltraPerformance}
r.FidelityFX.FI.Enabled 1 ← Frame Interpolation (FSR 3)
```
### 3.4 Upscaler Fallback Chain
`BPC_RenderPipelineManager.GetAvailableUpscalers()` implements a priority-ordered fallback:
```
Primary: DLSS (if RTX GPU detected)
Fallback 1: TSR (always available)
Fallback 2: FSR (if plugin installed)
Fallback 3: NIS (cross-vendor lightweight)
Fallback 4: TAAU (always available, legacy)
```
---
## 4. Baked Lighting Fallback Configuration
When a platform/profile selects `Baked_Lightmass` as the GI method:
### 4.1 Level Preparation for Baked Lighting
1. Set all primary lights to **Static** (not Stationary, not Movable)
2. Build lighting: `Build → Build Lighting Only`
3. Ensure lightmap UVs exist on all static meshes
4. Configure `World Settings → Lightmass Settings`:
- `Static Lighting Level Scale`: 1.0
- `Num Indirect Lighting Bounces`: 310
- `Indirect Lighting Quality`: 1.04.0
5. Place `Lightmass Importance Volumes` around playable areas
### 4.2 Reflection Setup for Baked Mode
When Lumen Reflections are off:
1. Place `Sphere Reflection Captures` throughout the level
2. Place `Box Reflection Captures` in interior rooms
3. Set capture resolution: 128256 (performance) or 512 (quality)
4. Build reflections: `Build → Build Reflection Captures`
### 4.3 Console Variables for Baked Mode
```
r.DynamicGlobalIlluminationMethod 0 ← Disable Lumen
r.Lumen.Reflections.Allow 0 ← Disable Lumen reflections
r.Shadow.Virtual.Enable 0 ← Disable VSM, use CSM
r.SSR.Quality 2 ← Enable screen-space reflections (fallback)
r.ReflectionMethod 2 ← Use reflection captures
```
### 4.4 Mesh LOD Fallback
When Nanite is disabled:
```
r.Nanite 0 ← Disable Nanite
r.StaticMeshLODDistanceScale 1.0 ← Maintain normal LOD distances
r.SkeletalMeshLODBias 0 ← No LOD bias for skeletal meshes
```
Ensure all static meshes have:
- LODs generated (LOD0 = full detail, LOD1 = 50%, LOD2 = 25%, LOD3 = 10%)
- `LODForCollision` set appropriately
- `MinLOD` not locked to 0
---
## 5. Planar Capture System Compatibility
### How Pipeline Changes Affect Captures
| Pipeline Change | Impact on Planar Captures | Mitigation |
|----------------|--------------------------|------------|
| Lumen → Baked | Capture renders baked lighting (looks correct). No Lumen overhead → faster captures. | `SS_PlanarCaptureManager` increases `GlobalQualityCap` by 1 tier |
| Baked → Lumen | Capture now includes Lumen GI (if capture profile allows). Higher cost. | `SS_PlanarCaptureManager` caps `GlobalQualityCap` to `Medium` or lower |
| Nanite → LOD | Faster capture render. No Nanite rasterization cost. | `SS_PlanarCaptureManager` increases budget |
| LOD → Nanite | Slower capture. Nanite in SceneCapture2D adds cost. | `SS_PlanarCaptureManager` reduces `MaxRegisteredSurfaces` |
| CSM → VSM | Higher quality shadows in captures. Minor cost increase. | No budget change needed |
| Upscaler change | **No impact** — captures render at native quality tier resolution | — |
### Capture Budget Adjustment Logic (in SS_PlanarCaptureManager)
```cpp
void SS_PlanarCaptureManager::AdjustBudgetForPipeline(const SRenderPipelineConfig& Config)
{
if (Config.GIMethod == ERenderPipelineMethod::Baked_Lightmass)
{
// Lumen is off — captures are cheaper, allow higher quality
GlobalQualityCap = EPlanarCaptureQualityTier::High;
MaxRegisteredSurfaces = DefaultMaxSurfaces * 1.5;
}
else if (Config.GIMethod == ERenderPipelineMethod::Lumen_GI)
{
// Lumen is on — captures are expensive
GlobalQualityCap = EPlanarCaptureQualityTier::Medium;
MaxRegisteredSurfaces = DefaultMaxSurfaces;
}
if (Config.MeshStrategy == EMeshStrategy::Nanite)
{
// Nanite in captures adds cost — reduce quality slightly
if (GlobalQualityCap > EPlanarCaptureQualityTier::Medium)
GlobalQualityCap = EPlanarCaptureQualityTier::Medium;
}
}
```
### Per-Capture Lumen Toggle
In `BPC_PlanarCapture.ApplyQualityTier()`:
```cpp
// If global pipeline has Lumen OFF, force capture Lumen OFF
if (!RenderPipelineManager->IsLumenEnabled())
{
QualityProfile.bEnableLumen = false;
}
```
---
## 6. Settings Menu Integration
### Video/Graphics Tab Layout (WBP_SettingsMenu enhancement)
```
┌────────────────────────────────────────────┐
│ VIDEO / GRAPHICS │
│ │
│ QUALITY PRESET [Low ▼] │
│ ⚠ Changing to Low requires level reload │
│ │
│ ──────── ADVANCED ──────── │
│ Resolution Scale [========|===] 85% │
│ Window Mode [Fullscreen ▼] │
│ VSync [✓] │
│ Frame Rate Limit [====|======] 60 FPS │
│ │
│ Global Illumination [Lumen ▼] ⚠ reload │
│ Shadow Method [VSM ▼] ⚠ reload │
│ Reflections [Lumen ▼] ⚠ reload │
│ Mesh Quality [Nanite ▼] ⚠ reload │
│ │
│ Upscaler [DLSS ▼] │
│ Upscaler Quality [Quality ▼] │
│ │
│ Texture Quality [====|======] High │
│ Post Process [====|======] High │
│ Shadows [====|======] High │
│ View Distance [====|======] High │
│ Foliage [====|======] High │
│ Anti-Aliasing [====|======] High │
│ │
│ Motion Blur [✓] │
│ Depth of Field [✓] │
│ │
│ Brightness [======|====] 1.0 │
│ HDR [✓] (if supported) │
│ │
│ [Apply] [Reset to Defaults] │
└────────────────────────────────────────────┘
```
Features labeled `⚠ reload` require a level transition to take effect. The UI shows a warning banner when any of these are changed.
---
## 7. Platform Certification Notes
### Sony PlayStation TRC Requirements
- **Minimum FPS:** PS5 must maintain 60 FPS in performance mode, 30 FPS in quality mode
- **Resolution Floor:** PS5 must render at ≥ 1080p internal before upscaling
- **PS4:** Must maintain 30 FPS, ≥ 720p internal
- **PSSR:** Must be listed as available upscaler on PS5 Pro
- **HDR:** Must support HDR10 output if display supports it
### Microsoft Xbox Requirements
- **Xbox Series X:** Must support 60 FPS performance mode + 30 FPS quality mode
- **Xbox Series S:** May target 30 FPS in quality mode
- **VRR:** Should support Variable Refresh Rate on HDMI 2.1 displays
- **Quick Resume:** Must save render pipeline state for Quick Resume compatibility
### Nintendo Switch Requirements
- **Handheld:** Must maintain ≥ 30 FPS at native 720p panel
- **Docked:** Must maintain ≥ 30 FPS at ≥ 720p internal (upscaled to 1080p)
- **Dynamic Resolution:** Strongly recommended for maintaining frame rate
- **Memory:** VRAM budget must be ≤ ~3.25 GB (4 GB total, 0.75 GB reserved)
---
## 8. Testing Matrix
| Platform | Low Preset | Medium | High | Ultra | Validate |
|----------|-----------|--------|------|-------|----------|
| PS5 | Baked+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Check 60 FPS at all tiers |
| PS4 | Baked+CSM+LOD | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Check 30 FPS floor |
| Xbox Series X | Baked+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Check VRR support |
| Xbox One | Baked+CSM+Proxy | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Check 30 FPS floor |
| Switch (docked) | Baked+CSM+Proxy | Baked+CSM+LOD | Baked+CSM+LOD | N/A | Dynamic res active |
| Switch (handheld) | Baked+CSM+Proxy | Baked+CSM+LOD | N/A | N/A | 30 FPS at 720p |
| PC High (RTX 3080) | SSGI+CSM+LOD | Lumen+VSM+Nanite | Lumen+VSM+Nanite | Lumen+HWRT+Nanite | DLSS working |
| PC Low (GTX 1060) | Baked+CSM+Proxy | Baked+CSM+LOD | SSGI+CSM+LOD | N/A | FSR working |
| SteamDeck | Baked+CSM+LOD | SSGI+CSM+LOD | SSGI+CSM+LOD | N/A | FSR working, 40 FPS |
---
## 9. Quick Reference: Console Variables
| Setting | CVar | Values |
|---------|------|--------|
| **GI Method** | `r.DynamicGlobalIlluminationMethod` | 0=Off, 1=Lumen, 2=SSGI |
| **Lumen Reflections** | `r.Lumen.Reflections.Allow` | 0/1 |
| **Lumen Diffuse** | `r.Lumen.DiffuseIndirect.Allow` | 0/1 |
| **Shadow Method** | `r.Shadow.Virtual.Enable` | 0=CSM, 1=VSM |
| **Shadow Quality** | `sg.ShadowQuality` | 0=NONE, 1=LOW, 2=MED, 3=HIGH, 4=EPIC |
| **Reflections** | `r.ReflectionMethod` | 0=None, 1=Lumen, 2=SSR |
| **SSR Quality** | `r.SSR.Quality` | 0-4 |
| **Nanite** | `r.Nanite` | 0/1 |
| **TSR** | `r.TemporalAA.Upsampling` | 0/1 |
| **Screen %** | `r.ScreenPercentage` | 25200 |
| **Texture Quality** | `sg.TextureQuality` | 03 |
| **Post Process** | `sg.PostProcessQuality` | 03 |
| **View Distance** | `sg.ViewDistanceQuality` | 03 |
| **Foliage** | `sg.FoliageQuality` | 03 |
| **AA Quality** | `sg.AntiAliasingQuality` | 03 |
| **Motion Blur** | `r.MotionBlurQuality` | 0=NONE, 2=MED, 4=EPIC |
| **DoF** | `r.DepthOfFieldQuality` | 0=NONE, 2=MED, 4=EPIC |
| **Volumetric Clouds** | `r.VolumetricCloud` | 0/1 |
| **Virtual Textures** | `r.VT.Enable` | 0/1 |
| **Ray Tracing** | `r.RayTracing` | 0/1 |
| **Texture Pool** | `r.Streaming.PoolSize` | MB value |
| **LOD Scale** | `r.StaticMeshLODDistanceScale` | 0.53.0 |
| **Foliage LOD** | `foliage.LODDistanceScale` | 0.53.0 |
---
*Platform Render Profiles Guide v1.0 — Part of the UE5 Modular Game Framework developer docs. Systems: BPC_RenderPipelineManager (149), DA_RenderPipelineProfile.*