champions-of-luneraria/docs/port/U5-VISUAL.md
Martin Stickelbroeck 9479d4452e Doku: Commit-ID U5.2 in PORT-QA und U5-VISUAL
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 17:46:36 +02:00

145 lines
10 KiB
Markdown
Raw Permalink 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.

# U5 · Visuelle Neuausrichtung
Stand: 2. Oktober 2026 · **Vertical Slice fertig** (`2c1686b`), Kartenqualität entschieden und umgesetzt (**Weg 2 Stufen** = `7fa038a`).
U5 ist die eigentliche Begründung für den Unity-Wechsel. Ziel ist stilisierter Realismus wie Dota 2 und aktuelle MOBAs: PBR-Oberflächen, ausgeformte Details, glaubwürdige Proportionen. Die Silhouetten bleiben klar und aus der Draufsicht auch bei über 100 Einheiten lesbar.
## Vorgaben des Projektinhabers (1. Oktober 2026)
- **Reihenfolge unverändert:** erst U3 (HUD) und U4 (Netzwerk), dann U5. Die Modelle werden nicht vorgezogen.
- **Stil:** stilisierter Realismus wie Dota 2 und aktuelle MOBAs. Dazu gehören PBR-Oberflächen, ausgeformte Details und glaubwürdige Proportionen. Die Silhouetten bleiben klar und aus der Draufsicht auch bei über 100 Einheiten lesbar.
- **Umfang:** Einheiten, Gebäude und Umgebung, also die ganze Welt, nicht nur eine repräsentative Gruppe.
- **Weg:** Die Quelle bleiben Blender-Generatoren im Repository mit reproduzierbarem FBX-Export und den U2A-Prüfungen. Dazu kommen gebackene PBR-Texturen (Albedo, Normal, Rauigkeit/Metall, AO).
- **Grenze:** Figuren mit handmodellierter Anatomie, Gesichtern und Haaren entstehen nicht prozedural. Sie brauchen Sculpts von Künstlern oder lizenzierte Asset-Bibliotheken. Downloads dafür gibt es nur nach Freigabe und Lizenzprüfung.
## Vertical Slice
Eine repräsentative Mid-Lane, auf Zielqualität gebracht:
- beide Teamrichtungen, zwei Türme, mindestens ein Ancient sichtbar,
- Fluss/Wasser, Vegetation, Felsen,
- mehrere normale Einheiten, ein Held, ein Angriffschampion,
- die Bossgrotte in sichtbarer Nähe, Kampf-VFX.
Nur diese Zone trägt die Zielqualität:
- Terrain, Wege, PBR-Materialien, Vegetation,
- Beleuchtung, Schatten, Himmel, Nebel, Wasser,
- Decals, Partikel, VFX, Color Grading.
## Umsetzung
### U5A · Gebackene PBR-Texturen
`tools/blender/bake_pbr.py` (Aufruf `sh tools/blender/bake_pbr.sh`) backt sechs nahtlose Sätze in Blender 5.2 (Cycles, 1 Sample, Emission des Musters; Torus-Mapping für Kantenfluss):
| Satz | Verwendung |
| --- | --- |
| `limestone` | Kluft-Stein, Pflaster, Klippen |
| `soil` | Erdreich, Wege |
| `bark` | Rinde, Baumstämme |
| `leaf` | Laub, Vegetation |
| `rock` | Felsen, geschichteter Stein |
| `water` | Flusswellen |
Jeder Satz liegt in `Assets/Luneraria/Art/Textures/`:
- `<name>-albedo-2k.png` — Grundfarbe
- `<name>-normal-2k.png` — Tangentialraum-Normal aus dem Höhenfeld (Sobel)
- `<name>-orm-2k.png` — R AO, G Rauigkeit, B Metall (Unity-ORM)
### U5B · Surface-Shader und Materialien
`Luneraria/Surface` trägt seit U5 die PBR-Karten:
- `_AlbedoMap`, `_NormalMap`, `_OrmMap` triplanar wie der Steinsatz,
- ORM steuert Rauigkeit, Metall und AO der PBR-Auswertung,
- die Welt-Modi (Terrain, Stein, Pflaster, Erde, Rinde, Laub, Wasser) behalten ihr Godot-Aussehen auf dem PBR-Satz,
- weiße Kontur-Höhenrelief (`_Relief`) bleibt als zusätzliche Schicht.
`LuneMaterialFactory` bindet je Oberfläche den passenden Satz (`PbrForMode`), `LN_Rock` den Felsensatz.
### U5C · Mid-Lane Umgebung und Licht
- **Nebel:** `ExponentialSquared`, Dichte 0,0085, Farbe `6a7f96` — Luftfeuchte des Tals.
- **Schatten:** Bias 0,02, NormalBias 0,35, Nahebene 0,2 — scharfe Kanten an Türmen und Felsen.
- **Post:** ACES, Bloom 0,62 / Threshold 1,15, Kontrast 14, Sättigung 16, Weißabgleich +8/−4, Vignette 0,18.
- **Himmel:** prozedural, Tint `2a3d58`, Atmosphäre 0,8, Reflexionen aus dem Himmel.
### U5D · Kampf-VFX und Nachweis
- **Trefferblitz** (`LuneUnitView.HitFlashGlow`): der Kern-HitFlash (0,18 s) und der Angriffs-Flash färben die Figur über einen `MaterialPropertyBlock` (warm beim Angriff, weißglühend beim Treffer); die geteilten Team-Materialien bleiben unangetastet.
- **Turmblitze** (`LuneMatchView.SyncBolts`): dreipunktiger Funke mit Bogen zur Kamera, Breitenkurve (Mündung → Kern → Spitze), Farbverlauf der Teamfarbe, Überblendung über 0,25 s.
## Nachweis
| Beleg | Ort |
| --- | --- |
| Mid-Lane Übersicht, Türme, Ancient, Grotte, Weitwinkel | `screenshots/u5/mid-lane-*.png` |
| Godot G3 Vorher | `../saumwacht-godot/docs/luneraria/screenshots/g3/vorher-1920x1080/` |
| Godot G3 Zwischenstand | `../saumwacht-godot/docs/luneraria/screenshots/g3/zwischenstand-1920x1080/` |
| U3 Motive (HUD über der Karte) | `screenshots/u3/motive-1920x1080/` |
| U2 Weltbilder (Vor-U5-Materialien) | `screenshots/u2b/` |
| Leistung | `logs/u5/player-benchmark-macos.json` |
Die Kamera der `u5/mid-lane-*`-Bilder folgt der Lage der G3-Motive (Turm, Ancient, Grotte); die Beleuchtung ist bewusst eigenständig gestimmt, nicht pixelgleich nachgebaut.
## Leistung
**Player** (macOS, Mono, Release; Apple M5, Metal; 1920 × 1080 im Fenster, VSync aus): Seed 9 in Runde 21, Spieltempo 1×, gemessen ab 10 s Kampf mit `LuneBenchmark`.
| Ansicht | Einheiten | fps (Mittel) | Bildzeit Median | p95 | Sim | Views | UI | Hauptthread |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| ganze Karte (Zoom 64) | 116 | 132 | 5,11 ms | 19,38 ms | 0,116 | 0,257 | 0,088 | 3,15 / 4,31 ms |
| Mid-Lane nah (Zoom 22) | 63 | 182 | 4,22 ms | 12,90 ms | 0,056 | 0,365 | 0,077 | 2,70 / 3,57 ms |
Gegenüber U3 (169 / 218 fps) kostet der PBR-Satz mit Normals, ORM und Nebel etwa 20–25 % Bildrate. Die Mid-Lane bleibt über 120 fps; die Karte über 100 fps. Metal liefert weiter keine GPU-Zeitstempel. Der nächste Hebel sind LOD und Material-Atlanten (U2-Folgerung), nicht die Dreiecke.
Rohdaten: `logs/u5/player-benchmark-macos.json`. Befehle siehe [U2-WORLD.md](U2-WORLD.md#leistung).
## Abnahme U5 (Vertical Slice)
| Vorgabe | Stand |
| --- | --- |
| Stil stilisierter Realismus (PBR, Details, Proportionen, klare Silhouetten) | erfüllt im Slice: PBR-Sätze, Normal- und ORM-Maps, Hit- und Angriffs-Flash, Turmfunke |
| Blender-Generatoren + reproduzierbarer Export + U2A-Prüfungen | erfüllt: `bake_pbr.py` (nahtlos, Torus-Mapping), bestehende FBX-Pipeline unverändert |
| Gebackene PBR-Texturen (Albedo, Normal, Rauigkeit/Metall, AO) | erfüllt: 6 Sätze × Albedo/Normal/ORM |
| Umfang Einheiten, Gebäude, Umgebung | Slice bringt die Mid-Lane (Terrain, Wege, PBR, Vegetation, Licht, Nebel, Wasser, VFX) auf Zielqualität; die übrige Karte behält den U2-Stand |
| Grenze: keine prozeduralen Gesichter/Haare/Anatomie | eingehalten — die Figuren behalten ihre Generatoren-Modelle; Sculpts bleiben vorbehalten |
| Vertical Slice: beide Richtungen, zwei Türme, Ancient, Fluss, Vegetation, Felsen, Einheiten, Held, Champion, Grotte, Kampf-VFX | erfüllt (siehe `screenshots/u5/`) |
| Vorher/Nachher gegenüber Godot G3 | erfüllt: `u5/` neben `g3/vorher-*` und `g3/zwischenstand-*`; Kamera bewusst vergleichbar, Licht eigenständig |
| Leistung gemessen | erfüllt (133 / 180 fps mit Stufen) |
| Erst danach über die ganze Karte entscheiden | entschieden: **Weg 2 (Stufen)**, umgesetzt |
## Entscheidung für die ganze Karte: Weg 2 (Stufen)
Am 2. Oktober 2026 fiel die Entscheidung des Projektinhabers: **Zielqualität entlang der Lanes, einfachere Randzonen.** Die Alternativen „Gleichziehen“ (PBR überall) und „Drosseln“ (PBR aus ab einer Schwelle) sind damit abgelehnt; „Drosseln“ bleibt als spätere Einstellung denkbar, ist aber nicht vorgesehen.
### Umsetzung
| Baustein | Ort | Inhalt |
| --- | --- | --- |
| `LuneZones` | `Assets/Luneraria/Editor/World/LuneZones.cs` | Korridor um die Lanes (22 m um eine Mittellinie, ein Gebäude oder die Grotte). `NearLane` entscheidet die Stufe eines Punkts |
| `_Quality` | `Assets/Luneraria/Shaders/LuneSurface.shader` | 1 = Lane-Stufe (Albedo, Normal, ORM triplanar), 0 = Randstufe (Farbe + Steinschicht, keine PBR-Maps, flaches PBR wie U2) |
| Materialstufen | `LuneMaterialFactory` | `Spec.Quality`; Randmaterialien binden keine PBR-Sätze. `TerrainEdge.mat` trägt die umgebenden Berge |
| Szenenaufbau | `LuneWorldBuilder.ApplyTier` | Jeder Weltknoten jenseits des Korridors bekommt `_Quality` 0 über einen `MaterialPropertyBlock`; der innere Boden bleibt Lane-Stufe, die Berge `TerrainEdge` |
| Nachweis | `screenshots/u5/edge-mountains.png`, `lane-and-edge.png` | Randstufe (Berge) und der Übergang Lane → Rand in einem Bild |
Gebäude (Türme, Ancients, Grotte), Einheiten, Wege, Wasser und der innere Boden bleiben unverrückt auf Zielqualität. Die Randstufe spart die neun triplanaren Map-Samples (Albedo, Normal, ORM) und behält Farbe, Vertex-Tönung, Steinschicht und Emission — also das U2-Aussehen der Berge.
### Leistung mit Stufen
| Ansicht | Einheiten | fps (Mittel) | Bildzeit Median | p95 | Sim | Views | UI |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| ganze Karte (Zoom 64) | 116 | 133 | 5,05 ms | 19,33 ms | 0,119 | 0,249 | 0,086 |
| Mid-Lane nah (Zoom 22) | 63 | 180 | 4,21 ms | 13,17 ms | 0,055 | 0.353 | 0,078 |
Die Zahlen liegen auf dem Niveau des Slices (132 / 182 fps): die beiden Messfenster sehen den Korridor, also die Lane-Stufe. Die Ersparnis der Randstufe zeigt sich in Weitwinkeln und am Rand (siehe `lane-and-edge.png`), nicht in diesen Fenstern. Für die übrige Karte ist Weg 2 die Vorgabe: hohe Qualität wo gespielt wird, einfache Materialien in den Bergen und an der Kluft.
Rohdaten: `logs/u5/player-benchmark-stufen.json` (Vergleich Slice: `logs/u5/player-benchmark-macos.json`).
## Bekannte Grenzen
- **Stufen statt flächiger Zielqualität:** Der Korridor um die Lanes (22 m) trägt die vollen PBR-Sätze; Berge, Kluft und ferner Hintergrund behalten Farbe + Steinschicht. Die Grenze ist bewusst hart (MaterialPropertyBlock je Knoten), kein weicher Verlauf.
- **Figuren** behalten die prozeduralen Generatoren-Modelle. Anatomie, Gesichter und Haare brauchen Künstler-Sculpts oder lizenzierte Bibliotheken (Freigabe und Lizenzprüfung vorbehalten).
- **Decals und Partikel** (Staub, Trefferfunken, Fußspuren) sind nicht Teil des Slice; der Hit- und Angriffs-Flash sowie der Turmfunke tragen die Kampflesbarkeit.
- **LOD und Draw Calls** sind nicht gemessen (Development-Player/Profiler); die U2-Folgerung bleibt offen.
- **Water Refraction / SSR** ist nicht gesetzt; der Fluss arbeitet mit Normals, Rauigkeit und Fresnel.
- **Godot G3** hat ein eigenes Lichtkonzept; die Bilder sind lagevergleichbar, nicht beleuchtungsgleich.
- **Einheitenmodelle** sind noch nicht auf Zielqualität; sie folgen erst, wenn die Umgebung steht.