Blood Gulch, lit by Unreal Engine with Halo CE's colours
Updated 2026-10-09 for classic maps 1.4.0, CE runtime 1.5.0 and mods 0.19.0: fog, MCC's transparent shaders, a sky that sits where Halo CE puts it, and maps that are no longer drawn too bright. Every screenshot and every comparison with the alpha is retaken on the 1.4.0 maps. The 1.4.0 changes come first below, then the 1.3.0 solver, then the 1.2.0 story they build on.
When the classic maps came to Halo Campaign Evolved in the alpha, they looked like Halo CE because, in a sense, they were Halo CE: every surface carried the light Bungie baked into it in 2001, painted on like a photograph. That made them faithful, and it also made them deaf. Campaign Evolved runs on Unreal Engine 5, which has real lights and real shadows, and none of it could reach the ground. Switch on a Warthog's headlights and the road stayed dark, while every player and vehicle in the beam turned glowing white.
The 1.2.0 maps changed that: they keep Halo CE's colours and its soft shade, but the light on them comes from Unreal Engine. The 1.3.0 maps went one step further and replaced Bungie's lightmaps with ones we bake ourselves, and the 1.4.0 maps add the fog and the effect shaders the PC version never had. Here's the difference between the alpha and now, from the same spots:
Timberland, alpha and now
Battle Creek, alpha and now
Death Island, alpha and now
1.4.0: fog, MCC's shaders and the right brightness
Everything was 1.7 times too bright
Death Island's bases came out white, while MCC draws them grey. The cause went back to before the classic maps had worlds of their own. Back then they loaded into a campaign level's world, and that world applies a colour correction that darkens every frame to 0.6 of its value. Our materials divided by 0.6 to undo it. Since September each map loads into its own world, which applies no such correction, but the division stayed. So every Halo CE surface on every map was drawn 1/0.6, or about 1.7, times too bright. The materials no longer divide, and a lightmap texel of 0.91 now shows as 0.91.
A Death Island base wall, 1.3.0 and 1.4.0
The difference holds outdoors too. The maps keep their colour and their shade, but they are no longer washed out:
Death Island, 1.3.0 and 1.4.0
Fog
Five of the classic maps have a fog plane: Damnation's shaft, Gephyrophobia's chasm, and the water on Battle Creek, Chill Out and Death Island. Anything under the plane fades into the fog's colour, more the deeper it is and the further away. Our converter never carried those planes over, so Gephyrophobia's chasm was a black pit, and you couldn't tell how far down it went.
The converter now reads each plane and its fog from the map, and the materials draw it the way MCC's environment shaders do. They follow the same recipe: how deep under the plane a surface is and how far it is from the eye, each against the fog's opaque depth and distance, mixed by how deep the eye itself is.
Gephyrophobia's chasm, 1.3.0 and 1.4.0
Chill Out's pool, 1.3.0 and 1.4.0
One attempt cut the fog off at the outline of its plane. That drew a hard-edged slab across Chill Out's lower floor, while MCC fogs the whole floor, because Halo CE fogs every part of the level the fog's region touches. The maps now fog everything under the plane's height, which matches MCC on all five.
MCC's teleporters and light volumes
Halo CE on the Xbox had a flexible shader for effects like teleporter fields, power-ups and beams of light. The 2003 PC version drew all of them with a simpler stand-in, and those stand-ins are all a classic map file carries. Rat Race's teleporter was a soft green blob tiled from two dust textures. MCC's Halo CE editing kit ships the original shaders at the same paths, so the converter now draws those instead, with a port of MCC's own shader code.
Rat Race's teleporter, 1.3.0 and 1.4.0
Fifteen shaders now draw MCC's originals, among them the teleporter fields, beacons and Damnation's light volumes. A few change with the live object, like Gephyrophobia's field generator shield, and those keep the PC version: without the object's state they drew white or red where MCC draws purple.
Damnation, 1.3.0 and 1.4.0
Damnation's light volumes also used to strobe. They flicker on purpose, but we picked a new random brightness thirty times per flicker, which at their 0.6-second period meant 50 changes a second. They now drift smoothly.
The sky, and cliffs in the dark
Halo CE draws the sky around the camera, wherever it is. Ours was a fixed mesh centred on the middle of the level's bounding box. On Gephyrophobia that put it 525 metres under the bridge, so the Halo ring rose from the wrong place. The sky now moves with the camera. The ring also tore where two of its strips met. Every texture we copied from MCC's tags, and every reflection cube map, was being read three texels out of place, because the file writer added 12 bytes of padding after the header.
Last, a fix for headlights. On the solver-lit maps, a face turned away from the sun got no Unreal-lit colour at all, so headlights, muzzle flashes and explosions stopped at a hard line where a cliff turned from the sun. Both sides now get a share of it. Sunlit faces are unchanged, and Unreal's sun still adds nothing to the far side.
Baking the light ourselves
Halo CE's lightmaps were computed once, in 2001, by a tool in Bungie's editing kit, and stored in the map files at the resolution a 2001 PC could afford: a whole base shares a 256-pixel page, so one texel of light covers a metre of wall. Everything we did in 1.2.0 had to work from those pages. Unreal drew its own sharp sun shadow on the ground, but the lightmap underneath still carried Halo CE's blurry copy of the same shadow, and on a Blood Gulch base roof you could see both: a soft, stepped blob inside a crisp edge.
A pillar's shadow on a Blood Gulch base roof, 1.2.0 and 1.3.0
The only real fix was to compute the light again, at a resolution of our choosing. So we wrote a radiosity solver that does what Bungie's tool did. The algorithm was recovered by reading the tool's own code: the sky's sun and fill lights as small grids of directional lights, the ambient light per cluster, every surface cut into patches that shoot their light at every patch they can see, patches that split themselves where the light changes quickly, and shadow rays traced through the map's collision model. The constants are the tool's own. We know we got it right because at Halo CE's own resolution our pages match Bungie's texel for texel, to within about 3 percent on most maps.
Ours runs on every core and is quick: a map that took Bungie's tool three and a half minutes takes three seconds, which is what lets us run it at up to eight times the resolution. Blood Gulch, Danger Canyon and Death Island are solved at eight times, Hang 'Em High and Gephyrophobia at four. The sun and the sky's fill are evaluated again at every single texel, so a shadow's edge lands exactly where the geometry puts it.
Part of a Death Island lightmap page: Halo CE's, and ours at eight times the size
With our own pages we could also stop guessing about the sun. The solver writes two extra pages beside each lightmap: how much of the sun reaches each texel, and the light the texel holds without the sun, which is Halo CE's ambient, sky fill and bounce. The maps draw that second page as their glow, and Unreal's sun, shadowed by the invisible copy of the level described below, draws every sun shadow by itself. The one-metre sun mask of 1.2.0 is gone, and with it the soft fade along every shadow.
Rocks that were half dark
Placed objects (boulders, trees, Covenant crates) are lit differently from the ground in Halo CE: the game samples the lightmap under the object and shades the whole object with that. In 1.2.0 our materials lit them with Unreal's sun as well, and the invisible level copy cast shadows across them, so a rock under a tree came out half dark and the tree's own boughs shadowed each other in ways Halo CE never drew. The 1.3.0 materials light scenery exactly the way Halo CE does and leave Unreal's sun off it.
Danger Canyon's rocks and trees, before and after
Lighting the inside of a base
Our first solves left Death Island's bases almost black. The strips of red and blue light along the pillars are surfaces that emit light in Halo CE, and in the solver they are supposed to shoot it at the walls. They never did. The solver stops when the average unshot light across the map drops below a threshold, and on an island the size of Death Island that average was met before thirty square metres of strip ever got their turn. Now every emitting surface shoots first, and the bases glow as they should.
Inside a Death Island base, 1.2.0 and 1.3.0
Along the way we built the map's placed light fixtures into the solver, twenty of them on Death Island, only to find that Halo CE's own lightmaps carry none of their light: the walls beside each fixture are no brighter than the walls elsewhere. Bungie's tool read those lights and, as far as its output shows, ignored them. So do we, by default.
Two smaller things fell out of the same comparison. Halo CE lights its sea floors with a constant colour rather than a solve, so ours do too, and the water's surface no longer blocks the sun on the way down: a rendered surface that has no collision, like water or a light strip, is not in a ray's way.
Gephyrophobia's deck
Gephyrophobia's deck, 1.2.0 and 1.3.0
Gephyrophobia's deck was blue-purple in 1.2.0. It should not have been. The level loader handed Unreal the sun's colour in the wrong colour space, which kept half the red and green out of every sun on every map. On a near-white sun nobody noticed; under Gephyrophobia's dusk it tinted the whole bridge. Fixed in the 0.18.0 mods.
Some of what follows came in last week's 1.1.0 maps (shading baked into corners, Halo CE's own glass and water, and rocks that had been drawn black), and the rest came with 1.2.0. It gets technical in places, but you don't need to know anything about graphics to follow it.
Why headlights turned everything white
The first clue was in the numbers. A camera in a game works like a real one: it has an exposure, which decides how much light makes a white pixel. The campaign sets it the way a real camera would in daylight. The converted maps didn't. They ran at an exposure meant for a dim room, with a sun of about 8 lux, roughly a living room at dusk. The maps still looked bright, because the exposure was cranked up to match.
That's fine until something brings its own light. A Warthog's headlights are modelled on real ones, spot lights of about 32,000 candela. Next to an 8-lux sun at living-room exposure, they were blindingly bright, so anything they touched blew out to white.
The fix is to keep the picture and change the units. The level loader now multiplies the sun and the sky by 256 and turns the camera's exposure down by the same amount (eight stops). On screen the map looks exactly as it did, but next to the sun the headlights are no longer hundreds of times too bright.
Teaching the ground to listen
That stopped the glare, but the ground still ignored the headlights. To see why, you have to know how a Halo CE map is lit.
In 2001 there was no way to light a whole level in real time, so Halo CE precomputed it. Its lightmaps record, for every patch of every surface, how much light lands there: sun, sky, the glow of a lamp, light bouncing off a nearby wall. The alpha drew each surface as "the texture times its lightmap", glowing with its own light like a backlit photo. An emissive surface doesn't react to anything, which is exactly why Unreal's lights slid off it.
Unreal-lit terrain splits that photograph back into parts:
- The surface itself. The base colour is what the surface would look like in Halo CE's sunlight, and Halo CE's bump maps now feed Unreal's surface normals. Every rock and panel has real relief that any light can catch.
- The sun, from Unreal. Unreal's sun now lights that surface directly, the same way it lights players and vehicles.
- Everything else, from Halo CE. Whatever the lightmap has that Unreal's sun can't explain (sky light, bounce, coloured lamps) is added back as a glow, so the total still matches Halo CE. Since 1.3.0 that glow is a page of its own from our solver rather than a guess made from the finished lightmap.
Put those back together and the map looks like Halo CE with nothing switched on. When a headlight, or any other light the game makes, adds light, it now has a surface to land on:
Timberland at dusk: a Warthog's headlights before and after
On the left, the same build with the new lighting switched off: the beam never reaches the grass, and the Warthog and Ghost glow as if lit from inside. On the right, the headlights light the grass ahead, and the Warthog and Ghost are shaded like the dusk around them.
The headlight beam on the grass, closer
Shadows from a level you can't see
For the ground to receive shadows, something has to cast them. Every map now loads an invisible copy of itself whose only job is to cast shadows. It casts from both sides of every surface. A one-sided version let the sun shine through the back of Blood Gulch's cliffs onto the ground in front of them.
That ghost level caused the most baffling bug of the week. Gun scopes and Warthog windshields started flashing as you moved. It looked like a lighting problem, but the cause was reflections: the invisible copy sits exactly on top of the real ground, and Unreal's reflections could see it. We counted frames of the ammo display: 7 in 16 flashed with the copy present, none without it. Telling Unreal that the copy is invisible to reflections, ray tracing and bounced light fixed it.
Keeping Halo CE's shade
This is how 1.2.0 did it. The 1.3.0 maps no longer need a sun mask, because the solver's own pages say exactly where the sun reaches.
Halo CE's shadows are soft and wide. Its lightmaps were computed at a coarse resolution and blurred, so the shade under Blood Gulch's bases spreads metres from the walls. Unreal's shadows are sharp and exact. Let Unreal's sun decide where shade falls and a lot of Halo CE's character disappears: a passage Halo CE kept dim comes out sunny.
So every 1.2.0 map carried a sun mask: a map of the level, one metre square per cell, saying how much of Halo CE's sun reached each spot. It was traced from Halo CE's own lightmap when the map was converted, and Unreal's sun was filtered through it. Where Halo CE was in shade, the sun stayed off, for the ground and for anyone standing there. A one-metre grid draws its own stair-step pattern along shadow edges, so the mask was blended over neighbouring cells, which turned the steps into a soft fade like Halo CE's. That fade is what you see on the left of the roof picture above, and it is why the sun mask had to go once we could solve the light ourselves.
Corners, and the trouble with triangles
The other thing that makes a place feel solid is darkness where surfaces meet: the foot of a wall, the inside of a doorway, the gap under a ledge. That's called ambient occlusion. Halo CE's lightmaps are too coarse to have much of it, so since 1.1.0 our converter traces it itself, firing rays from every patch of every surface to see how much of the sky is blocked.
A Blood Gulch base: the wall's foot and pillars, before and after
An early version of the new bake drew Blood Gulch's cliffs as a mesh of dark triangles. Halo CE's cliffs are made of large flat facets, and the gentle fold between two facets blocks a little sky right at the crease. Multiplied in, every fold became a visible line. The fix was a curve that ignores light occlusion entirely and only darkens real corners. We also tried smoothing the result, which washed out the corners people actually notice, so we took it out again.
The bugs along the way
A few smaller fixes made the difference between "interesting" and "done":
- Colours read twice. Some of the textures the loader builds at runtime were being colour-corrected on the way in, as if they were photos. A mid-grey value of 128 came back as 55, so every early test was too dark, and we spent a while tuning around a bug.
- A softer sun leaked light. Unreal can soften shadows by making the sun wider, and a 3-degree sun did soften the cliffs. It also let light leak through thin geometry, which drew bright lines on shaded ground and a halo around your gun as you walked. The sun is back to its real size.
- Black slivers. At first, wall bases had thin black outlines, exactly where Unreal's sharp shadow edge and the converter's coarser shading grid disagreed slightly. The materials now look a little way around each spot before deciding it's in shade.
- Gephyrophobia's teleporters. These aren't lighting, but they shipped in the same update. The game only sends you through a teleporter if a Spartan fits at the other end. Gephyrophobia's landing spots sat so close to the sides of their pads that a Spartan didn't fit, so every pad refused to send. The converter now moves cramped landing spots back towards the middle of their pads.
To find these quickly, the materials gained a debug view that shows one lighting layer at a time on screen: the ambient occlusion, the sun mask, Halo CE's original lightmap and Unreal's part. Most of the bugs above were spotted in it before anyone guessed at a fix. The solver has its own: run at Halo CE's resolution it scores every page against Bungie's, and most of the 1.3.0 findings above started as a number that was too high.
More from the alpha to now
Prisoner, alpha and now
Ice Fields, alpha and now
Hang 'Em High, alpha and now
Danger Canyon, alpha and now
Blood Gulch, alpha and now
Infinity, alpha and now
Sidewinder, alpha and now
Still rough
- Death Island's base interiors are a little darker than Halo CE's.
- Players, vehicles and weapons are not fogged yet, only the level.
- The map packs are larger since 1.3.0: lightmaps at eight times the resolution cost a few megabytes per map, and more video memory.
- Players standing in deep shade can still look a little brighter than Halo CE would draw them, because Unreal's sky light reaches them there.
Getting it
Open the launcher and, on the Multiplayer page, press Install multiplayer again. It fetches the 1.4.0 maps, the 1.5.0 runtime they need and the 0.19.0 mods, which also bring Halo CE's vehicle sets per game type and the playtest fixes (see the 0.19.0 changelog). Everyone in your fireteam needs the update, so the maps match. Then go look down Gephyrophobia's chasm, or step through a Rat Race teleporter.