Overview
A 1999 RTS, scanned
Holo Battlefield is a Vulkan particle renderer built into Warzone 2100. It draws the real terrain, the real unit and structure meshes, and the real combat state as dense fields of points, using the game's own textures, transforms and visibility rather than a substituted scene.
Terrain is sampled from the actual legacy fan or HQ surfaces using area-weighted triangle distributions, with barycentric placement driven by nested low-discrepancy identities and a fixed jitter. Those identities are seeded from the map's height and texture data and stay stable across quality changes, so raising detail adds points rather than reshuffling the ones already there. Sampling happens at load or when geometry is edited, never by rebuilding the cloud each frame.
Vehicles and structures reuse cached object-space templates transformed per instance, so hundreds of droids share one sampling pass. Authored UV colour, alpha cutouts, team masks and normals stay authoritative, and existing selection, damage, construction, repair and attachment state drives what you see.
A compute pass compacts the visible, stable identities into bounded indirect draw lists. Opaque support writes depth; fine emission and transparent effects are drawn separately, then HDR bloom and tone mapping run before the interface is composited on top.
An unofficial fan project, not affiliated with the Warzone 2100 Project. Every frame on this page is unmodified engine output.
Specification
Tech spec
| Host | Warzone 2100, originally released 1999 |
|---|---|
| Backend | Vulkan, Release C++ build |
| GPU requirements | Compute, storage buffers, indirect draws, large points, RGBA16F targets, D32 depth |
| Fallback | Unsupported hardware keeps conventional Vulkan or OpenGL rendering |
| Terrain sampling | Area-weighted triangles, barycentric, low-discrepancy identities with fixed jitter |
| Model sampling | Cached object-space templates, instanced per unit or structure |
| Culling | Compute compaction of stable identities into bounded indirect lists |
| Model density | 4,400 samples per 10,000 square model units before modifiers |
| Surface caps | 32,768 to 131,072 per component across Low to Cinematic |
| Template cache | 2,097,152 samples |
| Tone mapping | Manual exposure, ACES highlight compression, six bloom resolutions |
| Profiling | 37 asynchronous GPU timestamps, plus CPU work, present wait and allocation counters |
| Tests | 119,753 checks, 32 compiled shader variants, 73 launcher checks |
| Reference device | NVIDIA RTX 2050, Ryzen 5 7535HS, Windows x64 |
Features
What it does
- Stable identities. Per-point frustum, visibility and nested level-of-detail checks keep a sample's identity as camera density changes, so the cloud does not swim when you move. Steep tiles can carry up to 8,192 candidate samples at High and above before global normalisation.
- Filled, not wireframe. Surface, crease and team contributions were balanced so objects read as solid. Large meshes carry their true sample spacing through instance padding, which fixed an earlier class of holes where capped density and particle support disagreed.
- Real lighting. Normal-based moon and sky illumination, approximate roughness and specular response, short heightfield contact and horizon samples, and the game's own dynamic lights, all shading depth-writing surfels.
- Size hierarchy. Point-size classes derive from identity hashes, creases, silhouettes, distance and heat. Terrain stays fine; model edges and rare emitters get stronger centres. Selective HDR gain lifts emitters without brightening every material.
- An optional cinematic lens. Axial distance is reconstructed from sampled depth and the inverse view projection, then a fixed 24-sample circular gather with relative-depth rejection blurs outside a configurable sharp band. Emitter discs are energy-normalised and capped, dim terrain is never inflated, and the interface stays sharp because it is drawn afterwards. Off by default in normal play.
- Combat you can read. Real events drive flashes, warm fire lobes, ballistic sparks and debris, illuminated smoke and projectile presentation. Visual hashes and graphical time are used deliberately so none of it consumes the deterministic simulation's randomness.
- A functional interface. The optional dark cyan skin recolours panels, frames and scan details through native drawing paths. Widget locations, hit testing, queues, tooltips, selection, minimap interaction and the semantic health, team and status colours are all untouched. It is real game UI, not a decorative overlay.
- Comparison built in.
holocompareswitches between the previous and current detail passes,holoprofileruns a 240-frame warmup and 300-frame measurement, and choosing the classic renderer returns the conventional world.
Water
Reflections that keep the rules
Water follows the real map footprint across up to eight separate levels, with dark depth attenuation, wave normals and a Fresnel sky and moon response. Four world-anchored directions and wavelengths replaced an earlier three-direction field, and reflections sample that field at the receiving point so crests modulate the highlight and glints stretch along the wave.
Reflections show visible real model and effect particles, and this is the part worth stating plainly: the game's visibility rules are preserved inside the reflection, so a reflection can never reveal an opponent you have not scouted. A prettier implementation that ignored that would be a competitive exploit.
Shorelines get a spatially broken wash and restrained foam. Real water impacts throw ballistic spray and three expanding ripple populations that live for roughly one and a half to two seconds, stop at non-water tiles, and draw from the same bounded effects capacity as everything else.
Distance and valley haze, cool ambient light, sky lighting and the game's actual smoke supply atmospheric depth. No unrelated backdrop scenery was substituted to make the screenshots look better.
Budgets
Five presets, hard caps
Every preset is a set of explicit capacities rather than a vague quality slider. These are ceilings, not guaranteed visible counts.
| Low | 4,000,000 terrain anchors, 32,768 dynamic, 65,536 wreckage, density target 1.0 |
|---|---|
| Medium | 10,000,000 terrain anchors, 65,536 dynamic, 131,072 wreckage, density target 1.4 |
| High | 24,000,000 terrain anchors, 131,072 dynamic, 262,144 wreckage, density target 2.0 |
| Ultra | 32,000,000 terrain anchors, 196,608 dynamic, 393,216 wreckage, density target 2.5 |
| Cinematic | 40,000,000 terrain anchors, 262,144 dynamic, 524,288 wreckage, density target 3.0 |
Deliberate stress tests were run past capacity. High averaged 879 failed allocations per frame and Medium 428. Those are counted, bounded drops rather than hidden overflow, which is why the counters exist.
Measurements
Measured on one machine
| Baseline, live | 1.02 M visible, 1.96 ms CPU, 10.09 ms GPU, 515 MiB |
|---|---|
| High, lake scene | 2.24 M visible, 1.39 ms CPU, 14.21 ms GPU, 717 MiB |
| High, stress | 3.98 M visible, 4.04 ms CPU, 27.22 ms GPU, 717 MiB |
| Medium, stress | 1.51 M visible, 3.61 ms CPU, 12.86 ms GPU, 358 MiB |
| Latest, sharp | 3.12 M visible, 1.55 ms CPU, 20.01 ms GPU, 745 MiB |
| Latest, cinematic lens | 3.12 M visible, 1.56 ms CPU, 20.23 ms GPU, 745 MiB |
Scene-specific observations on one development device, not public frame-rate guarantees. The baseline used a 1280x720 internal resolution and the later figures 1600x900, so they are not a like-for-like comparison. Combat populations differ between scenes, CPU work excludes present wait, and the final comparisons ran with validation layers enabled. The sharp and cinematic pair is directly comparable: same resolution, same budgets, 23,992,060 terrain anchors and 861,829 templates, zero dropped allocations in both.
Launcher
Sixty-four settings, safely written
A native C# WinForms launcher starts the game. The top row selects the enhanced Vulkan renderer, classic Vulkan or OpenGL, resolution, display mode and quality from Low to Cinematic. Six tabs expose particles and detail, lighting and colour, the cinematic lens, water and atmosphere, combat and effects, and advanced settings.
Its schema is generated from the engine's own settings, so the 64 fields carry the real defaults and ranges and editable numeric dropdowns validate against them rather than against a duplicated list that could drift.
Writing the configuration is the part that had to be careful. The INI merge preserves unrelated keys, comments and sections, removes duplicate managed keys, and saves atomically while retaining a backup. A running-game guard prevents competing writes, paths resolve relative to the executable, and process launch uses Windows argument quoting without shell interpretation.
Honesty check
What is not implemented
The renderer is substantially upgraded and playable. These are the things it does not do, published rather than left for you to discover.
- No full-scene ray tracing. Reflections have limited coverage, terrain itself is not reflected, and there is no general wake history or shockwave refraction.
- Smoke is not globally sorted. Small GPU combat-smoke populations are not sorted across the scene and are not raymarched volumes.
- Contact lighting is approximate. Short heightfield samples, not full model shadow mapping or ambient occlusion.
- Not delivered: automatic exposure, general wakes and chromatic aberration.
- Close surfels and subpixel aliasing remain possible. Moving-camera review found no obvious redistribution, but that is qualitative evidence rather than exhaustive proof.
- Foundation edits can stall. Exceptional refreshes reached roughly 328 ms for 591,461 samples. That is an optimisation limitation outside steady-frame averages.
- Validation is concentrated on one Windows and NVIDIA device. Broad hardware coverage, multi-machine network testing and cross-version save certification are absent. The renderer is built to avoid consuming simulation randomness, but that is a design property, not a certified multiplayer compatibility claim.
- The launcher needs Windows and .NET Framework and its expected relative runtime layout.
Media
Gallery



