e385eae0f5
- docs/performance-budget.md: 60fps/2GB VRAM budget with CPU, GPU, memory, and draw-call targets (P95<16.6ms, P99<50ms) - scripts/profiling/: SceneTree + Node profilers, test scenes - scripts/generate_occluders.gd: auto-generate OccluderInstance3D from CSG wall pieces (128^3 voxel occlusion culling) - scripts/convert_csg_to_mesh.gd: CSG->StaticMesh baker with LOD slots (LOD1@15m, LOD2@30m) - project.godot: occlusion culling + LOD settings enabled - modular scene UV2 data from lightmapping pass - rcon_command_handler.gd conflict resolved (kept upstream plugin cmd) - Fixed profiler_node.gd warmup frame bug (60 frames, not 3) - Fixed convert_csg_to_mesh.gd LOD API (add_lod + distance)
92 lines
4.0 KiB
Markdown
92 lines
4.0 KiB
Markdown
# Phase 3 — Visuals & Performance Architecture
|
||
|
||
## Scope
|
||
Art pass, baked lighting, performance profiling, LOD + occlusion culling for the competitive tactical shooter.
|
||
|
|
||
|## Dependency Chain (Kanban)
|
||
|
|
||
|```
|
||
|t_p3_artkit (modular wall/floor kit + PBR materials 1K + art style guide) ✅ DONE
|
||
| └── t_p3_lighting (LightmapGI baked lighting + reflection probes)
|
||
| └── t_p3_profile (perf budget + LOD + occlusion culling)
|
||
|```
|
||
|
|
||
|## Deliverables
|
||
|
|
||
|- **Art style guide**: [docs/art-style-guide.md](docs/art-style-guide.md) — visual direction, modular grid specs, material palette, mapping guidelines
|
||
|- **Modular kit scenes**: `client/assets/scenes/modular/` — 11 CSG-based wall/floor/structural pieces + kit_demo showcase scene
|
||
|- **PBR materials**: `client/assets/materials/` — 7 StandardMaterial3D .tres files
|
||
|- **1K textures**: `client/assets/textures/` — 28 procedural PBR maps (basecolor, normal, roughness, metallic × 7 materials)
|
||
|- **Project config**: `client/project.godot` — Godot 4 Forward+ renderer, 128-tick physics, LightmapGI defaults
|
||
|
||
## Art Style
|
||
|
||
- **Valorant-direction**, not AAA photorealistic
|
||
- Clean silhouettes, team-colored zones (CT/blue, T/red-orange)
|
||
- 1K PBR textures (base color, normal, roughness, metallic)
|
||
- CC0-licensed or custom-created assets
|
||
|
||
## Lighting Strategy
|
||
|
||
- LightmapGI for all static geometry
|
||
- Reflection probes at corridor junctions and open areas
|
||
- No SDFGI or real-time GI
|
||
- Lightmap texel density: 4-8 per unit walls/floors, 8-16 for focal surfaces
|
||
|
||
## Performance Budget
|
||
|
||
| Metric | Target |
|
||
|--------|--------|
|
||
| Frame time | 16ms (60fps) |
|
||
| GPU budget | 8ms |
|
||
| CPU budget | 6ms |
|
||
| Draw calls | 1500-2000 per frame |
|
||
| VRAM | 2GB texture pool |
|
||
| LOD0 tris/wall | 500-2000 |
|
||
|
||
## Deliverables (t_p3_profile — Performance Budget & Profiling)
|
||
|
||
### Performance Budget Document
|
||
- **docs/performance-budget.md** — full frame budget breakdown, LOD thresholds, occlusion culling specs, profiling methodology, and pass/fail criteria
|
||
|
||
### Visibility Ranges (CSG LOD equivalent)
|
||
All 11 modular kit scenes now have distance-based visibility ranges:
|
||
- Walls/endcaps: visible up to 50m (fade over 5m)
|
||
- Floors: visible up to 60m (fade over 10m)
|
||
- Pillars/beams: visible up to 30m (fade over 3m)
|
||
- Accent panels: visible up to 20m (fade over 2m)
|
||
- Doorway/window walls: visible up to 40m (fade over 5m)
|
||
|
||
These are the immediate optimization for CSG-based geometry. When maps are built from the modular kit, ~30-50% of distant pieces are automatically culled.
|
||
|
||
### Occlusion Culling
|
||
- **client/scripts/generate_occluders.gd** — `@tool` script that auto-generates OccluderInstance3D nodes from wall/pillar CSG geometry
|
||
- **Project settings** enable occlusion culling at 128^3 voxel resolution
|
||
- Expected benefit: 30-50% reduction in visible geometry on structured indoor maps
|
||
|
||
### Profiling Tools
|
||
- **client/scripts/profiling/profile_scene.gd** — standalone headless profiler that captures per-frame metrics (frame time, GPU time, draw calls, tris, VRAM) and evaluates against budget; produces CSV output + summary stats (P50/P95/P99)
|
||
- Usage: `godot --headless --script scripts/profiling/profile_scene.gd --scene res://tools/test_map.tscn`
|
||
|
||
### CSG → Mesh Baking Pipeline
|
||
- **client/scripts/convert_csg_to_mesh.gd** — `@tool` script that converts CSG nodes to MeshInstance3D with LOD slot framework, enabling traditional mesh LOD for the final optimization pass
|
||
- Collision shape preservation, visibility range inheritance
|
||
|
||
### Project Configuration
|
||
- Forward+ renderer explicitly configured
|
||
- Occlusion culling enabled (128^3 voxels, 6 rays/octant)
|
||
- LOD settings tuned for competitive FPS scales
|
||
- All costly post-processing disabled (SSAO, SSR, glow, volumetric fog, TAA)
|
||
- MSAA x2 + debanding for clean image at minimal GPU cost
|
||
|
||
## LOD Strategy
|
||
|
||
- 3 LOD levels per modular asset
|
||
- LOD1 at 15m (50% tris), LOD2 at 40m (25% tris), LOD3 at 80m
|
||
- Occlusion culling via OccluderInstance3D auto-generation
|
||
|
||
## Reference Hardware
|
||
|
||
- GTX 1050 / RX 560 class GPU (or integrated graphics)
|
||
- Godot Forward+ renderer
|