← Development journal

/ 2 min read

Godot → Unreal: rebuilding the ride-in

The game keeps turning out to be cinematic: a low sun, haze, a rider coming out of the dust. The opening shot is Ioma riding in over the lens, and in Godot it never looked the way it reads on the page. The dust in particular was underwhelming. So we took one day to rebuild that single shot in Unreal Engine 5.8 and compare the results directly.

There was one condition: no Blueprints. An agent can't usefully click through node graphs, so everything had to be C++ or a script. The scene is a C++ actor. Materials, meshes and the level are built by a headless Python script. The Niagara dust is authored over the editor's built-in MCP server. A render loop (tools/ue.sh shot) writes frames to disk so the work can be checked by looking at them, not by guessing.

First pass, before any dust

Godot and Unreal, four moments from the shot

The horse, rider, dunes, props, timing and camera are the same in both, ported over unchanged. What changed is the lighting. Unreal's sky atmosphere, Lumen global illumination, volumetric fog and physically based exposure turn the same low sun into backlight with real haze in the distance. The wind ripples in the sand finally read.

With dust

Godot and Unreal with the dust in, three moments after the pass

Godot's dust was a soft white blob. In Unreal it's lit by the sun and sits in the same air as the fog: a low plume off the hooves, plus a long faint trail that hangs over the track behind her.

The decision

After that comparison it wasn't close. Unreal is now the engine. The Godot project is removed from the working tree and kept at the tag godot-final. BRIEF v0.4 and docs/decisions.md record the change.

Some things carry over unchanged:

  • The rules of the game (the "sim") were always engine-free. They're a C# library today and will be ported to plain C++20, with the C# version kept as the reference until the port's state hashes match.
  • The art pipeline: generated meshes, rigs and textures come in through scripts, the same as before.

Still open

  • Volumetric (fog-density) dust whites out half the frame, so it's off for now.
  • The sand sheet thrown over the lens as she passes is mostly hidden by the near-camera fade.
  • Sound only exists in the offline movie render, not in the game.
  • No Unreal CI yet, and no Windows build.

Lowwater is in development. These notes capture the game at the time of writing; plans and visuals may change.

More from the making of Lowwater.

Follow along ↗