GPU Fire Propagation system for Unreal Engine

Last Updated: 17th July 2026
Tutorial created in Unreal Engine 5.7

Download Plug-in (UE5.7) – coming soon


This tutorial describes a system to handle fire propagation mostly on the GPU without voxels or grids which can be quite heavy.

Note: This first part of the tutorial is quite in-depth, a good knowledge of C++, HLSL and UE shaders is necessary.
The free plugin takes care of all the work, feel free to skip to the usage section


The GPU handles building a Burn Mask with a gradient around the outside from 0.0 on the outside to 1.0 further in, depending on how slow you want things to catch on fire.

This Burn Map can be quite small, it doesn’t need a granular resolution as the fire and flame vfx hide a lot of that – it can be made as big as you feel looks good for your situation though.

The GPU propagates by way of a “combustion” map and a wind velocity with optional wind flow map to move around solid objects.

The Landscape material and foliage have routines reading this burn map and render the burn from that.


The CPU is in charge of spawning flames and smoke still, but this is cut down to a minimum amount of work per frame.

An area of the Burn Map is copied to the CPU once per frame – this area is calculated from the visible distance divided by your “split” amount, the default is 9, so the visible area is divided into 9ths and one is handled per frame.

Once that portion of the texture is locked, it’s passed to a background thread which then finds the area of the burn map that is between 0.01 and 0.99 in value – the active part of the burn. Random distributed locations around this area are selected and their x/y/z is stored – the z is the burn value between 0.01 and 1.0. The amount of locations can be varied for control of play speed.

An array of these locations is then returned to the game thread.

The closer to zero the Z value is, the newer the burn – as Z progresses to 1.0, that’s it’s burn time – so this outline area of the Burn Map must extend for the tallest foliage you want to burn (the height of the tallest is used as a divider for other foliage to calculate the rate of vertical fire growth multiplied by it’s combustibility rate).

You have the option to run a tight filter on the values (e.g. less than 0.05) and create Niagara Grid3D systems at these locations for high quality burns, use the system below, or modify the previous routine to use pre-computed locations on objects from a table of locations (this way works well for ECS type objects) directly in that thread, avoiding the need for any scanning – if you’re using tight collision capsules on the tree trunks, this way is good.


To find where to spawn, the array of locations is iterated, the Z is multiplied by the tallest foliage height and if the height is over a certain amount a multi sphere trace is run with the radius being slightly more than the height. The landscape height can be obtained from the landscape, a nav-mesh or a custom height-map (always handy to have one).

Sphere traces aren’t inherently slow, the data it uses to find the collisions is spatially optimized and they’re right routines. But if for any reason processing time is an issue (e.g. mobile) this operation can be split over multiple frames, and the “process on 9ths” can be run once every X frames.

Depending on how dense you want the fire/smoke you can process all returned hits or just the amount you want.

If the hit returns a static mesh component you can get it’s height and combustibility from custom data or LUTs and then run a second sphere trace at the corrected height to find the closest hit on that foliage instance – the hit location here is the spawn position for the vfx.

If the Z height is below a threshold or the hit is the landscape, the vfx can be spawned on the ground at x/y.