# VQ1-SPEC — Spécification `DefaultScalability.ini` (Low → Epic) **Fiche :** VQ1-T1 **Rôle :** A-ARCH **Modèle attendu :** claude-sonnet-5-5-high (M2) **Date :** 07 octobre 2026 **Workspace :** `d:\Game\LifePlay-master 5.5` **Statut :** Spécification — prête pour implémentation (VQ1-T2) **Dépend de :** `VQ0-CART.md` (cartographie des réglages Video), lot L7c (`Config/DefaultEngine.ini`) --- ## 1. Objectif Définir, pour le projet, un fichier `Config/DefaultScalability.ini` qui précise explicitement les cvars appliqués par les niveaux de qualité **0 (Low) → 3 (Epic)** pour **quatre groupes seulement** : | Groupe | cvar de niveau | Section INI (par niveau) | |---|---|---| | Ombres | `sg.ShadowQuality` | `[ShadowQuality@0]` … `[ShadowQuality@3]` | | Textures | `sg.TextureQuality` | `[TextureQuality@0]` … `[TextureQuality@3]` | | Effets | `sg.EffectsQuality` | `[EffectsQuality@0]` … `[EffectsQuality@3]` | | Anti-aliasing (qualité) | `sg.AntiAliasingQuality` | `[AntiAliasingQuality@0]` … `[AntiAliasingQuality@3]` | Ces quatre groupes préparent le futur bloc `LPVideo*` (VQ0-CART §7) et remplacent la dépendance implicite aux valeurs par défaut du moteur par des valeurs **lisibles, versionnées et revues**. ## 2. Périmètre et interdits ### 2.1 Dans le périmètre - Niveaux **0, 1, 2, 3** des 4 groupes ci-dessus. - Cvars de qualité « classiques » UE5 (résolution d'ombres, cascades, pool de textures, anisotropie, qualité de réfraction, qualité du post-AA). ### 2.2 Interdits (hors périmètre — ne doit jamais apparaître dans `DefaultScalability.ini`) | Interdit | Raison | |---|---| | Illumination globale dynamique (`r.DynamicGlobalIlluminationMethod`, `r.Lumen.*`, groupe `GlobalIlluminationQuality`) | Verrouillée à `0` par le lot L7c (rendu 4.27 conservé). | | Ombres virtuelles / VSM (`r.Shadow.Virtual.*`, y compris `r.Shadow.Virtual.Enable`) | Verrouillées à `0` par L7c. Aucune cvar `r.Shadow.Virtual.*` ne doit être ajoutée, même « inoffensive ». | | Méthode d'anti-aliasing (`r.AntiAliasingMethod`) | Verrouillée à `2` (TAA) par le lot L6a / L7c : TSR fait scintiller les maillages à morphs. Le groupe `AntiAliasingQuality` ne règle **que** la qualité, pas la méthode. | | Méthode de reflets (`r.ReflectionMethod`, `r.SSR.*`, groupe `ReflectionQuality`) | Verrouillée à `2` (SSR) par L7c. | | Groupes `ViewDistanceQuality`, `PostProcessQuality`, `ShadingQuality`, `FoliageQuality`, `LandscapeQuality`, `ResolutionQuality`, `GlobalIlluminationQuality`, `ReflectionQuality`, `SkeletalMeshQuality`, `HeightFieldShadowQuality`… | Non demandés ; les valeurs moteur (`BaseScalability.ini`) restent inchangées. | | Niveau Cinematic (`@Cine`, niveau 4) | Non exposé au joueur ; valeurs moteur conservées. | | Toute modification de `Config/DefaultEngine.ini` | Les contraintes L7c/L6a y restent la source de vérité. | > **Garde-fou L7c (rappel) :** `r.DynamicGlobalIlluminationMethod=0`, `r.ReflectionMethod=2`, `r.Shadow.Virtual.Enable=0`, `r.AntiAliasingMethod=2` dans `[/Script/Engine.RendererSettings]` de `DefaultEngine.ini`. Ces valeurs sont au niveau de priorité *ProjectSetting*, supérieur à *Scalability* : elles ne peuvent pas être écrasées par un niveau de scalabilité, mais la règle ci-dessus évite néanmoins toute tentative. ## 3. Correspondance des niveaux | Niveau | Nom | Usage | |---|---|---| | 0 | Low | Machines faibles / GPU intégrés | | 1 | Medium | Machines modestes | | 2 | High | Cible standard | | 3 | Epic | Qualité maximale proposée ; reste **conservatrice** (pas de valeur au-delà du palier Epic moteur) | Principe « conservateur » : chaque valeur est choisie **au plus égale** à l'équivalent Epic du moteur UE 5.5 et sans activer de fonctionnalité nouvelle par rapport au rendu 4.27 validé. Aucune cvar susceptible de changer le *look* (volumetric fog, distance-field shadows, capsule shadows, SSS profile, bloom…) n'est incluse : elles restent aux valeurs moteur. ## 4. Tableau niveau → cvars ### 4.1 ShadowQuality (`sg.ShadowQuality`) | cvar | 0 Low | 1 Medium | 2 High | 3 Epic | Commentaire | |---|---|---|---|---|---| | `r.Shadow.CSM.MaxCascades` | 1 | 2 | 3 | 4 | Cascades du soleil | | `r.Shadow.MaxResolution` | 512 | 1024 | 2048 | 2048 | Résolution max ombre dynamique (plafonnée à 2048) | | `r.Shadow.MaxCSMResolution` | 512 | 1024 | 2048 | 2048 | Résolution max par cascade | | `r.Shadow.RadiusThreshold` | 0.06 | 0.05 | 0.04 | 0.03 | Rayon écran min. pour projeter une ombre | | `r.Shadow.DistanceScale` | 0.6 | 0.7 | 0.85 | 1.0 | Distance de rendu des ombres | | `r.Shadow.CSM.TransitionScale` | 0.0 | 0.25 | 0.6 | 1.0 | Fondu entre cascades | | `r.Shadow.PreShadowResolutionFactor` | 0.5 | 0.5 | 0.75 | 1.0 | Résolution des pré-ombres | Non inclus volontairement : `r.Shadow.Virtual.*` (interdit), `r.DistanceFieldShadowing`, `r.CapsuleShadows`, `r.VolumetricFog*`, `r.LightMaxDrawDistanceScale`, `r.LightFunctionQuality`. Cohérence : `r.MinScreenRadiusForCSMDepth=0.010000` reste fixé dans `DefaultEngine.ini` (non touché). ### 4.2 TextureQuality (`sg.TextureQuality`) | cvar | 0 Low | 1 Medium | 2 High | 3 Epic | Commentaire | |---|---|---|---|---|---| | `r.Streaming.MipBias` | 2.5 | 1 | 0 | 0 | Mips abaissés (0 = pleine résolution) | | `r.MaxAnisotropy` | 0 | 2 | 4 | 8 | Filtrage anisotrope | | `r.Streaming.PoolSize` | 200 | 400 | 700 | 1000 | Budget pool de streaming (Mo) | | `r.Streaming.MaxEffectiveScreenSize` | 0 | 0 | 0 | 0 | 0 = comportement moteur | `r.TextureStreaming=True` reste imposé par `DefaultEngine.ini`. ### 4.3 EffectsQuality (`sg.EffectsQuality`) | cvar | 0 Low | 1 Medium | 2 High | 3 Epic | Commentaire | |---|---|---|---|---|---| | `r.TranslucencyLightingVolumeDim` | 24 | 32 | 48 | 64 | Volume d'éclairage des translucides | | `r.RefractionQuality` | 0 | 2 | 2 | 3 | Qualité de réfraction | | `r.SSS.Scale` | 0.25 | 0.5 | 0.75 | 1.0 | Échelle subsurface scattering | | `r.SSS.SampleSet` | 0 | 1 | 2 | 2 | Jeu d'échantillons SSS | | `r.DetailMode` | 0 | 1 | 2 | 2 | Seuil des composants « detail mode » | | `fx.Niagara.QualityLevel` | 0 | 1 | 2 | 3 | Niveau de qualité Niagara | Non inclus : `r.SSR.Quality`, `r.Lumen.*` (interdits), `r.BloomQuality`, `r.SceneColorFormat`, `r.EmitterSpawnRateScale`. ### 4.4 AntiAliasingQuality (`sg.AntiAliasingQuality`) | cvar | 0 Low | 1 Medium | 2 High | 3 Epic | Commentaire | |---|---|---|---|---|---| | `r.PostProcessAAQuality` | 0 | 2 | 4 | 4 | Qualité du post-AA (échelle moteur 0–6) | Non inclus : `r.AntiAliasingMethod` (interdit, fixé à 2/TAA), `r.TSR.*` (TSR non utilisé), `r.TemporalAA*`. `r.PostProcessAAQuality=4` pour Epic = palier moteur ; la valeur 6 est réservée à Cinematic et n'est pas utilisée. ## 5. Note « Overall » `sg.OverallQuality` (« Overall ») n'a **pas** de section propre dans `DefaultScalability.ini` : l'application d'un niveau Overall `N` consiste à **appliquer le même niveau `N` aux quatre groupes** (`sg.ShadowQuality`, `sg.TextureQuality`, `sg.EffectsQuality`, `sg.AntiAliasingQuality` = `N`). Les autres groupes de scalabilité restent à leur valeur courante. Conséquence pour le futur sous-système `LPVideo*` : un sélecteur « Overall » doit écrire `N` sur ces 4 groupes uniquement (via `Scalability::SetQualityLevels` en préservant les autres champs de `FQualityLevels`), et ne pas déclencher d'effet de bord sur GI, reflets, VSM ou méthode d'AA. ## 6. Règles de fusion et de priorité 1. `Config/DefaultScalability.ini` est lu après `Engine/Config/BaseScalability.ini` ; les sections portant le même nom (`[ShadowQuality@2]`…) sont **fusionnées clé par clé** : les clés non listées conservent la valeur moteur. 2. Les cvars appliquées par scalabilité ont la priorité `SetByScalability`, **inférieure** à `SetByProjectSetting` (`DefaultEngine.ini`). Les verrous L7c ne peuvent donc pas être contournés. 3. Les valeurs `sg.*` choisies par le joueur sont persistées dans `GameUserSettings.ini` (`Saved/Config/Windows`) ; elles choisissent le niveau, pas le contenu des sections. 4. Aucun `DeviceProfile` n'est défini dans `Config/` (pas de `DefaultDeviceProfiles.ini`) : pas de surcharge supplémentaire à prévoir. 5. Le fichier ne contient que des sections `@0`–`@3` des 4 groupes, rien d'autre. ## 7. Points d'attention (VQ0-CART §6) - **Redondance BP :** les curseurs BP `ShadowQuality`, `PostProcessAAQuality` (qui pilote `r.PostProcessAAQuality` directement), `PostProcessQuality` restent actifs. Un curseur BP `AA Quality` qui fixe directement `r.PostProcessAAQuality` aura priorité de dernière écriture sur le niveau `sg.AntiAliasingQuality` ; le futur `LPVideo*` devra les masquer/synchroniser (hors périmètre VQ1). - **Aucun changement C++/Blueprint** dans VQ1 : uniquement configuration. - **Vérification des valeurs moteur :** les valeurs de §4 sont fondées sur les paliers usuels de `BaseScalability.ini` UE 5.x ; elles doivent être confrontées au fichier de l'installation 5.5 lors de la validation (VQ1-VAL). ## 8. Critères d'acceptation (pour VQ1-T2 et validation) - [ ] `Config/DefaultScalability.ini` existe et ne contient que `[ShadowQuality@0..3]`, `[TextureQuality@0..3]`, `[EffectsQuality@0..3]`, `[AntiAliasingQuality@0..3]`. - [ ] Aucune occurrence de `Virtual`, `Lumen`, `GlobalIllumination`, `AntiAliasingMethod`, `ReflectionMethod`, `SSR` dans le fichier. - [ ] `Config/DefaultEngine.ini` inchangé (L7c intact). - [ ] En jeu, `sg.ShadowQuality 0..3` (etc.) modifie `r.Shadow.MaxResolution`, `r.Streaming.PoolSize`, etc. conformément au §4 (`Scalability` console / `stat`/`r.X` en lecture). - [ ] Rendu à niveau 3 : GI dynamique, VSM et méthode d'AA inchangés (Lumen/VSM off, TAA).