while it’s not perfect this workaround works well. The only downside is that the less tone curve amount you set, the less tonemapping you will get, resulting in an overall washed picture. But 0.8 is a good compromise.
Another problem is that emmisive gradients will look strange unfortunately. 
I hope some day there will be an easy solution to this problem, it’s bugging me far too long. 
I am surprised in over 4 years there hasn’t been a solution to this, I am assuming it must be quite complex. The ideal solution would be if they introduced a new option in materials, instead of connecting to Emissive we could connect to a simple Glow or Stylized Glow or whatever title fits best.
In their docs, the legacy tonemapper effect is just so beautiful and exactly what I need, but at the same time I wouldn’t want to modify the global settings when I only need it on specific things, that’s why having a separate option just for this in materials would be ideal, or something similar. Really hope they consider doing something like this soon, such a cool effect. Best of luck to everyone.
Some time ago I tried to replace the tonemapper with a different one (sadly I don’t remember which one it acutally was
)
But with this approach you can even decide if you want saturated or washed out emissive colors by changing the saturation value in the material.
Unfortunately you can’t use the tone mapping settings that you could normally use. So you have to adjust the image inside the post process material and build your own system.
If you want to test for yourself this is the material:
CustomEmissivePostProcess.zip (82.4 KB)
I tried to do this for my best friend who couldn’t live with these colors. Looked that strongly changes colors. Bloom has changed, but does a similar effect and I did not change it. But the tonemapper makes everything white. I rewrote it as in 4.14. Something worked, but it’s not quite the same effect.
4.27:
4.27 with old tonemapper from 4.14:
4.14:
When you enter the command r.TonemapperFilm 0, the old settings are opened in the post process

4.27 now:
4.14:
Can someone suggest what else can be done. Maybe we’ll make everything perfect)
ShadersPrivate27from14.7z (16.4 KB)
Aware that this is a really old thread but it’s still an issue. I want to create a material that’s akin to uranium glass, a thing that in real life photographs glows bright green, but I’m not able to mimic it in unreal.
I would also like to be able to have a glowing material with a lot of bloom, without having the colors turn to white. It’s been how many years now and it’s still not something Epic cares about?
everything I did could not be done, my friend was able to reach out to the developers and he was answered with this:
“First of all reorder tonemapper to legacy shader by r.tonemapperFilm 0, we have added old defaults so now it is quite easier to get same stylized colors as <15 versions.
Than you can look at “crush highlights” curve that now negates white PBR shift to legacy curve settings, so simply pull it to 0.
After that yuu can apply same contrast and saturation, but notice that ACES applies boosted threshold so your bloom goes overbright, to handle that you can cut it with “Gain” global to about 0.5.
It will not reproduce colors completely, but closest we have got.”
NAIL IN THE COFFIN.
This has been an issue in Unreal Engine for nearly a DECADE!
I have been an absolute MAD MAN vibe coding like a ■■■■ the past few months, and I ran into needing to fix this (YET AGAIN!)
I was not gonna stop this time.
Unfortunately I have tried a post process material, C++ plugin, trying to hijack the bloom buffer, all sorts of stuff tbh way over my head.
I got a solution vibe coded. Unfortunately, you have to modify the engine, which of course for most users is no fun.
I ended up with a “r.Tonemapper.EmissivePreservation 0” realtime console command that can alpha lerp the old and new emission code while keeping the rest of the default UE5 tonemapper in EXACT SAME SHAPE!
It’s beautiful.
Here are examples:
r.Tonemapper.EmissivePreservation 0 (UE5 default)
.Tonemapper.EmissivePreservation .5 (blend)
.Tonemapper.EmissivePreservation 1 (UE4 default)
All while retaining the exact same scene representation in tonemapper background.
Here is the technical rundown of what (AI) did. This is vibe coded (using Claude Opus 4.5 Thinking) please take it with a grain of salt, I don’t expect it to be perfect or even proper. It just did end up working though, so I needed to share!
Context Prompt I had it make for this post:
_______________________________________________
Engine Modification: Preserving Emissive Color Saturation in ACES Tonemapper
Problem:
The default ACES tonemapper in UE5 desaturates bright emissive materials to white, which is technically correct for ACES but undesirable for artistic control over HDR emissive content. Bright colored emissives (neon signs, glowing UI elements, etc.) lose their saturation and become washed out.
Solution:
I’ve implemented a simple engine modification that adds a new console variable r.Tonemapper.EmissivePreservation to selectively preserve hue and saturation for bright pixels while maintaining the standard ACES tone curve for everything else.
Technical Implementation:
1. Add Console Variable
In PostProcessTonemap.cpp (around line 64):
TAutoConsoleVariable CVarEmissivePreservation(
TEXT(“r.Tonemapper.EmissivePreservation”),
0.0f,
TEXT(“Preserve hue/saturation for bright emissive pixels (0=off, 1=full preservation)”),
ECVF_Scalability | ECVF_RenderThreadSafe);
2. Add Shader Parameter
In PostProcessTonemap.cpp, add to the FTonemapParameters struct (around line 347):
SHADER_PARAMETER(float, EmissivePreservation)
3. Initialize Parameter
In PostProcessTonemap.cpp, in the parameter setup function (around line 876):
CommonParameters.EmissivePreservation = FMath::Clamp(CVarEmissivePreservation.GetValueOnRenderThread(), 0.0f, 1.0f);
4. Add Shader Variable
In PostProcessTonemap.usf (around line 92):
float EmissivePreservation;
5. Implement Preservation Logic
In PostProcessTonemap.usf, after ColorLookupTable() call (around line 540):
// Store pre-tonemap color for emissive preservation
half3 PreTonemapColor = FinalLinearColor;
half3 OutDeviceColor = ColorLookupTable(FinalLinearColor);
// Preserve emissive color saturation for bright pixels
BRANCH
if (EmissivePreservation > 0.0)
{
const float3 AP1_RGB2Y = float3(0.2722287, 0.6740818, 0.0536895);
float InputLuminance = dot(PreTonemapColor, AP1_RGB2Y);
BRANCH
if (InputLuminance > 1.0)
{
// Calculate how bright the emissive is
float EmissiveStrength = saturate((InputLuminance - 1.0) / max(InputLuminance, 0.001));
EmissiveStrength *= EmissivePreservation;
// Preserve original hue and saturation for bright pixels
float OutputLuminance = dot(OutDeviceColor, AP1_RGB2Y);
float3 PreservedColor = normalize(PreTonemapColor) * OutputLuminance;
OutDeviceColor = lerp(OutDeviceColor, PreservedColor, EmissiveStrength);
}
}
Algorithm:
• Only affects pixels with luminance > 1.0 (HDR range)
• Calculates emissive strength based on how far above threshold the pixel is
• Preserves the original color’s hue/saturation by normalizing the input color and scaling by output luminance
• Blends between standard tonemapped result and preserved color based on emissive strength
• Uses ACEScg (AP1) color space for luminance calculations to match the tonemapper’s working space
Usage:
r.Tonemapper.EmissivePreservation 0.0 // Off (default, standard ACES behavior)
r.Tonemapper.EmissivePreservation 0.7 // Recommended (subtle preservation)
r.Tonemapper.EmissivePreservation 1.0 // Full preservation (maximum saturation)
Results:
• Bright emissive materials maintain their color saturation instead of washing out to white
• Zero performance impact when disabled (default)
• Minimal performance cost when enabled (two branches for HDR pixels only)
• All other post-processing (bloom, exposure, color grading, TAA, DLSS) works normally
• Fully runtime adjustable via console variable
Compatibility:
• Tested on UE 5.6 (custom fork)
• Should work on UE 5.0+
• Requires engine source access
• After modifying files, rebuild with -recompileshaders flag
This modification provides artistic control over emissive appearance while maintaining the technical benefits of ACES tonemapping for the rest of the image.
Here are the edits (for 5.6):
V2 updated
EmissiveTonemapperMod.zip (20.3 KB)
I hope this helps someone! This also solves the AGES OLD ERROR of emissive media playback being incorrect colors!!










