Files
tactical-shooter/docs/visuals-architecture.md
T
shawn e385eae0f5 feat: performance budget profiling setup
- 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)
2026-07-01 19:01:03 -04:00

92 lines
4.0 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.
# 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