Playtest When? Episode #1
Welcome Employees to the first episode of ‘Playtest When’ - a series we’re running which will help you understand the tech that goes into our game, and the challenges we are tackling to make sure the next playtest gives off the best possible player experience.
First up we’re going to chat about lighting. It might seem like a straightforward process, but in order to make it look good, update to changing lighting scenarios and weather, and run more performant, it takes a lot of additional work. Today's topic: Global Illumination.
What is Global Illumination?
Global illumination (GI) is how lighting bounces around a scene in the map. When light hits a wall and picks up its radiance or lighting, it carries it onto a surface in the game. If you get it right, the room you’re in will have depth, but if we turn it off the interiors will go flat. There will be no softer shadow, and it won't feel like the surfaces are made of anything (think PS1 vibes)
GI OFF
GI ON
We use Unreal Engine 5, so most development teams will just use Lumen out of the box. While it is impressive technically, it has major limitations which the team were not happy with and we wanted to replace it with something tailored to our game.
Enter Storm GI
Storm GI calculates this illumination data with a dynamic light probe system that builds the data in 3D space around the player.
A probe is a point in the world that samples the light around it.
Rather than just spawning millions of uniform probes, which is a waste of resources, memory and performance; our new system places these probes dynamically around each area in the map depending on surface/area density.
There are fewer probes on flat and empty surfaces where change is minimal (outside on flat plains, for example), and many probes nearer to edges and detail, where the light actually has contract (like inside busier buildings with more stuff in)
One of the crucial differences between Lumen and Storm GI is that we can cache a lot more data as the player moves around the map, saving on rebuilding lighting costs.
The probe lighting itself is sampled at one eighth of the resolution, and then upsampled and smoothed out accordingly. Each probe also renders a depth map, which stops light leaking through the walls, making it more immersive (and actually correctly lit). An additional occlusion filter decides and handles how much light from the sky reaches each of the indoor spaces, just like in real life.
An important visual difference is that we temporally blend the 3D probe data, and not the full screen space pass, meaning there are no temporal artifacts when the player vehicle/weapon moves across the screen. This was a huge issue with Lumen.
Why It’s a challenge
Before we did this, we used Lumen. In theory it's a powerful tool, but for our game specifically, it worked against the immersion we were trying to build.
Lumen spawns its probes dynamically, and adjusts wherever your camera is looking. Once you move the player camera, the entire landscape would become unstable. Through testing we’ve seen ghosting, smearing, shimmering and flickering (which of course, isn’t the experience we want anyone to have).
Reflections would get murky, and above all else, it was very expensive for GPUs. Lumen costs between 2-4ms of frame time to load on mid range GPUs such as the RTX3060 (which means your machine works harder to process it). It’s not good enough for the average gamer.
Lumen was designed on the assumption that GPUs get faster every year, which isn’t really the case currently.
Unreal 5.8 has support for cached probes to accelerate Lumen, but it still has the problem of relying too heavily on temporal full screen passes which causes huge amounts of ghosting.
The worst case for this was the weather (which is a huge part of our game - tornados, blizzards, storms). If we couldn’t fully immerse you while you’re being flung into the air by a massive twister, we’re not doing what we intend with the game.
Building our own system has currently taken over two months to get it to a production-ready state, but it's something that could continue to work on for a lot, lot longer.
What you'll notice
Two things:
It’s faster. Storm GI costs around 1ms per frame, against Lumen’s 2-4ms. That makes our newly updated system twice as fast, even in the most busy, high detailed areas. The frame time we gain goes into other areas of the game (which means smoother running overall)
It’s steadier. Because none of the probes are chasing the player camera, the image holds together when you move about. It holds together in all weather conditions, where the older system struggled to keep up.
Above all else, you’ll get interiors that get the proper lighting that they need, as well as the depth, shadows and surfaces that respond to light instead of looking like they are painted on top.
The Reflection System
We’re also building a custom reflection system for our interiors.
The downside with probe-based lighting is that the surfaces can lose the material response when no dynamic light actually hits them. The reflection system fixes that in indoor environments.
Reflection system off
Reflection system on
This system benefits the wider development team too. Lumen gave our lighting artist quality and performance sliders, which was just to allow us to see how the result was allowed to look overall. But with our newly built system, we have far more artistic control. We’re now able to control the strength, saturation and colour far better, to allow us to actually build exactly what we are looking to do.
That’s the difference between tuning for the best option we want vs picking the least bad one.
GI Artist control panel
Lumen’s slider panel
What's still in the oven?
Being completely honest, we’re not done yet with the systems tooling. There are still a few things we’re trying to iron out ahead of the next playtest (which will get done)
Foliage still flickers at a lower resolution, which isn’t what we intend. This is currently being worked on.
There is still a bit of probe leaking at the boundaries between detail tiers. A low-detail probe from outside can still currently bleed into a high-detail interior - again, not intentionally (its currently on the list)
The colour capture is less rich than Lumen’s. As a team we’ve decided that its an acceptable trade-off for the time being, because the game runs on a muted palette anyway - the difference is very small - but something we’ll come back to in the future.
This concludes episode one! We’ll be sharing a tonne more of these types of blogs, where we cover the tech under the hood of our game, and how we’re tackling these challenges.

