champions-of-luneraria/docs/port/U5-VISUAL.md
Martin Stickelbroeck 2c1686b837 U5 Vertical Slice: PBR-Sätze, Surface-Shader, Mid-Lane, Kampf-VFX
Die Mid-Lane steht auf Zielqualität (stilisierter Realismus). Die übrige
Karte bleibt auf dem U2-Stand, bis über den Weg entschieden ist.

- U5A: tools/blender/bake_pbr.py backt sechs nahtlose PBR-Sätze
  (limestone, soil, bark, leaf, rock, water) mit Albedo, Normal aus dem
  Höhenfeld (Sobel) und ORM (R AO, G Rauigkeit, B Metall), je 2k.
  Torus-Mapping für Kantenfluss wie phase10/bake_bark.py.
- U5B: Luneraria/Surface trägt _AlbedoMap, _NormalMap, _OrmMap triplanar
  über den Godot-Weltfarben; ORM steuert Rauigkeit, Metall und AO.
  LuneMaterialFactory bindet je Oberfläche den passenden Satz, LN_Rock
  den Felsensatz.
- U5C: Mid-Lane-Licht — Nebel (ExponentialSquared, Dichte 0,0085),
  scharfe Schatten (Bias 0,02), Weißabgleich und Vignette, ACES und
  Bloom leicht angehoben.
- U5D: Hit- und Angriffs-Flash über MaterialPropertyBlock (warm beim
  Angriff, weißglühend beim Treffer), Turmblitze als dreipunktiger Funke
  mit Breitenkurve und Farbverlauf. CaptureMidLane schreibt fünf
  Nachweisbilder nach docs/port/screenshots/u5/.
- Leistung (macOS-Player, 116 Einheiten): 132 fps Übersicht, 182 fps Mid
  nah — 20–25 % unter U3 durch PBR, Normals und Nebel. Mid-Lane bleibt
  über 120 fps.
- Tests: EditMode 29/29, PlayMode 13/13, Kerntests 457/457. Keine
  Regeländerung; Golden 51.221 Werte unverändert.
- Grenze eingehalten: keine prozeduralen Gesichter, Haare oder Anatomie.
  Sculpts bleiben vorbehalten (Freigabe und Lizenzprüfung).
- Dokumentation: U5-VISUAL (Umsetzung, Nachweis, Entscheidungsvorlage
  für die ganze Karte), PORT-QA (U5), PORT-STATUS, KNOWN-BEHAVIOR-
  DIFFERENCES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 17:10:10 +02:00

127 lines
8.2 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.

# U5 · Visuelle Neuausrichtung
Stand: 2. Oktober 2026 · **Vertical Slice fertig** (`luneraria/u5`).
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 (132 / 182 fps) |
| Erst danach über die ganze Karte entscheiden | **offen** — Entscheidungsvorlage unten |
## Entscheidungsvorlage für die ganze Karte
Der Slice trägt die Zielqualität zu einem Preis von 20–25 % Bildrate. Für die ganze Karte stehen drei Wege offen:
1. **Gleichziehen:** denselben PBR-Satz auf alle Zonen legen. Einfach, aber die Übersichts-Kamera fällt unter 100 fps sobald viele Einheiten im Bild sind.
2. **Stufen:** Zielqualität nur entlang der Lanes, einfachere Materialien in Randzonen und im Hintergrund (Berge, Kluft). Empfehlung des Ports.
3. **Qualität drosseln:** PBR-Aus, wenn `units_alive_max` oder Zoom eine Schwelle überschreitet. Sauber per Einstellung, aber sichtbarer Umschaltmoment.
Erst nach dieser Entscheidung werden die restlichen Zonen und die Einheitenmodelle hochgezogen.
## Bekannte Grenzen
- **Nur die Mid-Lane** trägt die Zielqualität. Die übrige Karte bleibt auf dem U2-Stand (einfache Materialien, kein Nebel-Feinschliff).
- **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.