PART 1
Using Easy Tonemapper
What the plugin does, whether you need it, and how to use it. The technical reference below explains exactly what it changes.
What it does
Unreal renders your scene with a far wider range of brightness than a screen can show. A tone mapper squeezes that range down into the final image. Unreal's default, Filmic, handles very bright, saturated colour in a particular way: a bright red light can drift toward orange, and strong colours wash out toward white.
Easy Tonemapper replaces Filmic with a tone mapper of your choice. Exposure, bloom and your Post Process Volume colour grading carry on as before (in SDR; see HDR output for what has been checked in HDR). The one exception is Blue Correction, an ACES-specific adjustment, which is switched off by default (see Settings).
Is it right for your project?
Likely a good fit if
- your project is on UE 5.0 – 5.7, where, for SDR output, Unreal has no built-in alternative to Filmic
- your scenes have strong, colourful light — neon, fire, magic, sci-fi glow, stylised lighting. This is where the difference is clearly visible.
- you make games or other real-time projects, where what Unreal renders is the final image
- you do product or archviz work (Khronos PBR Neutral is aimed at this)
Probably not needed if
- your scenes use natural light and already look right to you under Filmic — the difference there can be subtle
- you render cinematics out of Unreal and grade them afterwards in DaVinci Resolve or Nuke
- you're on UE 5.8 and happy with Epic's free Standard ACES option
A quick way to judge: open the included test chart, or put a bright red or blue light in one of your scenes, and compare Filmic with AgX.
Before you start
- The plugin changes one engine file while the editor is open. That is how it swaps the curve inside Unreal's own colour-grading LUT build, which keeps your Post Process Volume grading working in SDR (see HDR output for HDR). The original is backed up first and restored when you close the editor and from the crash handler; after a crash or forced shutdown, opening a project with Easy Tonemapper enabled restores it. Your tone mapper choice stays saved in your project. See Safety and recovery.
- Your engine install must be writable. Standard Epic Games Launcher installs are. If yours isn't, the plugin tells you and leaves the engine file untouched.
- If your studio forbids modifying the engine installation, don't use this plugin.
- On UE 5.8, try Epic's option first: Post Process Volume → Film → Method → Standard ACES. It's free and may be all you need.
- Existing scenes will look different after switching, and scenes tuned under Filmic may need some re-grading. That's true of any tone mapper change.
Quick start
- Install the plugin from Fab (or copy the
EasyTonemapperfolder into your project'sPluginsfolder), enable it in Edit → Plugins, and restart the editor. - Open the Easy Tonemapper menu from any of these:
- the Easy Tonemapper button in the level editor toolbar
- Tools → Rendering → Easy Tonemapper
- Project Settings → Plugins → Easy Tonemapper
- Choose a tone mapper from the drop-down list. It's applied straight away: the shader recompiles in a few seconds and the viewport updates. The menu always shows the tone mapper that's active.
To go back to Unreal's default at any time, choose Restore Engine Defaults.
Test chart
The plugin includes a small map that shows what a tone mapper does to bright colour: rows of glowing spheres in red, orange, green, blue and white, each column two stops (4×) brighter than the one before. Exposure is fixed and bloom is off, so only the tone curve changes (plus Blue Correction, which is off by default while another tone mapper is active).
- In the Content Browser, open Settings and tick Show Plugin Content.
- Open Easy Tonemapper Content → Demo → Maps → ToneMapperTestChart.
- Switch tone mapper and compare the right-hand columns.
What to look for: under Filmic, bright red turns orange and then yellow, bright green turns yellowish, and bright blue turns pale cyan. Under AgX each colour keeps its hue as it fades to white. In the first two columns, at ordinary brightness, the difference is small.
For the chart's intended framing, right-click Chart Camera in the Outliner and choose Pilot.
Choosing a tone mapper
| Tone mapper | Choose it when |
|---|---|
| Engine Default (Filmic) | You want stock Unreal. The engine file is left identical to a clean install. |
| AgX – Neutral | You want AgX without a creative look. |
| AgX – Golden | You want AgX with a warm, slightly desaturated look. |
| AgX – Punchy | You want AgX with more contrast and saturation. |
| Reinhard | You want a simple reference curve to compare against. |
| Uncharted 2 (Hable) | You want a classic game-style filmic curve. |
| GT (Uchimura) | You want control over shadows, midtones and highlights. |
| Khronos PBR Neutral | Khronos PBR Neutral is aimed at product shots and archviz. |
| Lottes | You want a simple curve anchored at middle grey, without a strong look. |
Reinhard, Uncharted 2, GT and Lottes keep very bright, saturated lights saturated (and can shift orange towards yellow) instead of fading them to white. For bright coloured lights, choose AgX or Khronos PBR Neutral. The test chart shows the difference.
Tuning the look with the Film sliders
While a tone mapper other than Engine Default is active, the five Film sliders in your Post Process Volume adjust that tone mapper instead of Filmic (in SDR; see HDR output for HDR). Not every slider acts on every tone mapper (see Film slider mapping). Changes show up immediately, with no shader recompile — a quick way to find the look you want.
An untouched Post Process Volume gives each tone mapper's standard look; nothing changes until you move a slider. Like any post-process setting, the sliders work per volume, but most projects set them once for a consistent look.
To use a slider, tick its box in the volume's Film section. The Easy Tonemapper menu shows what each slider does for the tone mapper you've selected, under Fine-Tuning (its wording differs slightly from this table). For AgX, for example:
| Film slider | What it does with AgX |
|---|---|
| Slope | Brightness. Higher is brighter. |
| Toe | Midtones and shadows. Higher is darker and punchier. |
| Shoulder | Saturation. Higher is more colourful. |
| Black clip | Shadows. Higher turns shadows black sooner. |
| White clip | Highlights. Higher raises the ceiling before highlights go to white, but the image looks darker. |
The full table is in Film slider mapping. To leave the sliders alone, turn off Map Film Sliders To Operator.
Settings
Project Settings → Plugins → Easy Tonemapper, or Advanced Settings... in the Easy Tonemapper menu.
| Setting | Default | What it does |
|---|---|---|
| Tonemapper | Engine Default | The active tone mapper. |
| Map Film Sliders To Operator | On | Lets the Film sliders adjust the active tone mapper. |
| Disable Blue Correction | On | Turns off Blue Correction, an ACES-specific adjustment, while another tone mapper is active. |
Every change is applied as soon as you make it, here or in the menu.
Settings are saved in Config/DefaultEasyTonemapper.ini, so they can go into source control and be shared with your team.
Packaging your game
The tone mapper you've selected is compiled into your game's shaders when you package a Windows build. The plugin's code is not included in packaged builds. HDR in a packaged game has not been checked (see HDR output).
If your project doesn't list which maps to package, Unreal packages every map and asset it can find, and that includes the plugin's test chart (about 320 KB). To leave it out, add /EasyTonemapper/Demo to Project Settings → Packaging → Directories to never cook.
Movie Render Queue
Render (Local) and Render (Remote) both use the tone mapper you've selected.
Render (Remote) starts a second Unreal process. Its log says Easy Tonemapper is inactive there, because your editor already owns the engine file. That's expected: the render still uses your editor's tone mapper. Keep the editor open until the render finishes.
HDR output
On UE 5.0 to 5.7 your curve applies on Unreal's ACES 1000 and 2000 nit HDR output devices (PQ and scRGB). On UE 5.0 to 5.7, on those four ACES devices, Engine Default uses Unreal's own HDR output transform (ACES), not Filmic. Other HDR output devices have not been checked. How far this has been tested is listed at the end of this section.
Where a pixel's brightest colour channel is below four fifths of SDR white, the picture is the same as the SDR picture from the same tone mapper (this is not Unreal's own HDR look). Above that, pixels are brightened on a smooth curve, measured in stops, towards the output's peak, scaling the whole pixel so hue and saturation are untouched in the scaling.
On UE 5.0 to 5.5 the peak is a fixed 1000 or 2000 nit preset for the output device; it is not read from your display. On UE 5.6 and 5.7 the code uses the peak Unreal reports when HDR output is running and the same preset otherwise; the reported-peak path was not observed. Very saturated highlights can read above the peak after Unreal's colour conversion.
On UE 5.8 the plugin adds nothing to HDR: the curve you pick feeds Epic's own HDR path, which does the expansion while Film → Method is Filmic. That is read from Unreal's shader and was not tested.
From reading Unreal's shader, on UE 5.0 to 5.7 Post Process Volume white balance, saturation, contrast, gamma, gain and offset are applied before the HDR step; that was not tested in HDR.
To set up HDR output, follow Epic's steps, for example r.AllowHDR=1, then r.HDR.EnableHDROutput 1 or the Enable HDR Display Output node. Nothing needs switching on in the plugin. Windows also needs HDR switched on for the display ("Use HDR" in Windows display settings). These are Epic's and Windows' steps, not the plugin's, and they were not used as written in the HDR checks described below.
How far this has been tested:
- HDR was checked by decoding captured frames of the included test chart from the ACES 1000 nit PQ output back to nits, on UE 5.0, 5.6 and 5.7 only, with the output device forced on an ordinary monitor.
- The 2000 nit and scRGB outputs were not measured.
- UE 5.1 to 5.5 were not measured: on the test machine, which has no HDR display, UE 5.1 would not switch to an HDR output device.
- HDR on UE 5.8 was not tested.
- HDR in a packaged game was not checked.
- The Color Grading LUT, Tone Curve Amount and Blue Correction have not been checked in HDR.
- None of it has been viewed on a physical HDR display.
Troubleshooting
"Inactive: another editor (...) owns the engine file" at the top of the menu
Another editor on the same engine version has already applied its tone mapper, and the viewport shows that one. Close the editor named in the message and restart this one.
"Not applied: ..." at the top of the menu
The last change couldn't be applied; the rest of the message says why, and the entries below explain the common causes.
"Easy Tonemapper cannot write to the engine shader directory" or "... is marked read-only, so Easy Tonemapper cannot patch it"
Your user account can't change the engine install. Grant write permission to the engine folder (or clear the read-only flag on the file), then try again.
"Anchor not usable in ... expected ... found ..." or "Injection anchor not usable in ..."
The engine shader file is not the one this plugin expects (a different engine version, or a file that has been edited). The engine file was left untouched.
"Could not read the plugin shader ... Reinstall Easy Tonemapper"
Part of the plugin is missing. Reinstall it.
"UnrealEditor.exe - Bad Image ... is either not designed to run on Windows or it contains an error ... Error status 0xc0e90002", or the plugin doesn't load on Windows 11
This is Windows Smart App Control blocking a plugin file, not a fault in the file. Smart App Control blocks program files that aren't digitally signed unless Microsoft's online service already recognises them. Unreal plugin files usually aren't signed, whether they come from Fab or are built on your computer, so this can happen with any code plugin, not only this one. Its decisions can also vary: the same file can be blocked once and allowed on the next launch.
- Close the message and start the editor again. It often loads on the next try.
- If it keeps happening, the setting is in Windows Security → App & browser control → Smart App Control. Microsoft offers no way to allow individual apps, so the only choice there is on or off for the whole computer. Whether to change it is up to you.
The viewport didn't change
Look for an error notification in the bottom-right corner of the editor; it explains what went wrong. On UE 5.8, also check the Post Process Volume's Film → Method is set to Filmic; UE 5.8's Standard ACES method is never touched.
Something looks wrong
Choose Restore Engine Defaults, or disable the plugin and restart. As a last resort, Verify the engine in the Epic Games Launcher, which restores every engine file.
Still stuck? Ask in the SDProjects Discord support channel ↗.
Removing the plugin
- Choose Restore Engine Defaults from the Easy Tonemapper menu.
- Close the editor.
- Delete the
EasyTonemapperplugin folder (or uninstall it through the Launcher). You can also deleteSaved/EasyTonemapperandConfig/DefaultEasyTonemapper.inifrom your project.
Roadmap
Planned updates (none of these are included in the current version):
- Before/after images: save your viewport side by side, Unreal's default next to your tone mapper.
- Match Blender out of the box: an AgX option aimed at matching Blender's default look.
PART 2
Technical reference
For technical artists and programmers who want to know exactly what the plugin changes.
Where it hooks into the pipeline
Unreal bakes tone mapping into a 3D colour-grading LUT built in /Engine/Private/PostProcessCombineLUTs.usf. In that pass:
- Post Process Volume grading (white balance, then
ColorCorrectAll: saturation, contrast, gamma, gain, offset) runs in scene-referred linear space. - The tone curve runs —
FilmToneMapfor Filmic. - A user Color Grading LUT, if any, is applied to display-referred values.
Easy Tonemapper replaces the call in step 2. In SDR, steps 1 and 3 are unchanged, and so are Tone Curve Amount and the 5.8 Standard ACES path.
On UE 5.0 to 5.7 the four ACES HDR output devices (1000 and 2000 nit, PQ and scRGB) take a separate branch of the same file that never calls the tone curve in step 2: it hands the graded colour from step 1 straight to an ACES output transform, so Easy Tonemapper replaces that call as well (see What changes in the engine file). UE 5.8 routes its HDR branches through the same tone-curve call as SDR while Film → Method is Filmic, so nothing more is replaced there (as read from Unreal's shader; HDR on UE 5.8 was not tested). What has been checked in HDR is listed under HDR output.
Why not a LUT, a post-process material or a Scene View Extension
- Filmic applies its S-curve to each channel separately, in AP1. That's what shifts the hue of bright, saturated colour, and grading can't prevent it because grading runs before the curve.
- A Color Grading LUT runs after the curve, so it can't recover what the curve has already compressed.
- A post-process material in the Replacing the Tonemapper slot needs no engine edits, but Unreal then skips building its colour-grading LUT, so Post Process Volume grading stops applying. (Checked in the UE 5.0 and 5.8 renderer.)
- A Scene View Extension subscribed to
EPostProcessingPass::ReplacingTonemapperdoes the same: the LUT pass is skipped, and the extension receives only scene colour and bloom, so exposure, local exposure, vignette, film grain, chromatic aberration and output encoding all have to be reimplemented. That pass only exists from UE 5.6. (Checked in the UE 5.8 renderer and in all nine engine versions' headers.)
Swapping the curve inside the LUT build is how this plugin keeps Unreal's own grading path.
What changes in the engine file
The plugin edits PostProcessCombineLUTs.usf in place:
- The call
FilmToneMap( ColorAP1 )is rerouted toEasyTonemapper_ToneMap( ColorAP1 ). - The two Blue Correction lines are scaled by a define, so the setting can switch it off.
- On UE 5.0 to 5.7 only, the call that applies Epic's ACES output transform on the four ACES HDR output devices (1000 and 2000 nit, PQ and scRGB) is rerouted to
EasyTonemapper_ToneMapHDR(...). On UE 5.0 to 5.5 that is two lines, one for each of the 1000 and 2000 nit transforms. On UE 5.6 and 5.7 it is two lines (the ACES 1.3 and ACES 2 versions), and each appears twice, once in the PQ (ST2084) branch and once in the scRGB branch; both are rerouted. UE 5.8 needs no such edit, because its HDR branches already go through the call above while Film → Method is Filmic (as read from Unreal's shader; HDR on UE 5.8 was not tested). - After
#include "TonemapCommon.ush", one fenced block is inserted: the current settings as#defines, followed by the plugin's shader code written out in full.
The code is inlined rather than included from the plugin's folder so that any project on the same engine version can compile the file, including projects that don't have the plugin. Before writing, the plugin checks that each anchor appears the number of times it expects (once, except the two HDR lines on UE 5.6 and 5.7, which appear twice each), and refuses shader code that includes anything outside /Engine/. No copy of an Epic shader file is shipped or swapped in.
Safety and recovery
- Backup first. The original is copied to
<Project>/Saved/EasyTonemapper/Backups/with a manifest recording its hash and engine version. The patched file starts with a marker carrying the same hash. - Refuses rather than guesses. If any anchor is missing, or appears a different number of times than the plugin expects (for example on an unsupported engine version), the engine file is left untouched.
- Restored automatically on editor exit and from the crash handler. If neither got the chance, for example after a forced shutdown, the next launch of a project with the plugin restores it.
- Engine Default leaves the file byte-identical to a clean install.
- UE 5.8's Standard ACES method is never touched.
Several editors and engine versions
Projects on the same engine version share one engine file, so the plugin holds one lock per engine version (in %LOCALAPPDATA%/EasyTonemapper). Only the first editor opened on that version applies its settings; any other shows a warning and leaves the file alone. While the first is open, other projects on that engine version — with or without the plugin — compile the patched file and use its tone mapper. A lock left behind by a crashed editor is taken over automatically.
Different engine versions have separate locks and don't affect each other.
Film slider mapping
| Tone mapper | Slope | Toe | Shoulder | Black clip | White clip |
|---|---|---|---|---|---|
| AgX (all three looks) | Look slope (gain) | Look power | Look saturation | Exposure floor, 8 stops across the slider | Exposure ceiling, 8 stops across the slider |
| Reinhard, Uncharted 2 | Exposure into the curve | – | – | – | – |
| GT (Uchimura) | Contrast a | Toe curvature c | Linear section start m | Black lift, up to 0.25 | Peak brightness P |
| Khronos PBR Neutral | Highlight desaturation | – | Compression start | – | – |
| Lottes | Contrast a | – | Roll-off strength 1 − d | – | Brightest input mapped to white |
Each slider is measured from its engine default (Slope 0.88, Toe 0.55, Shoulder 0.26, Black clip 0.0, White clip 0.04). The sliders are already bound shader parameters on the LUT pass, which is why changes need no recompile.
For GT and Lottes, the resulting parameters are clamped to the ranges where the curve rises smoothly to white with no dips or overshoot, checked numerically over every combination of the sliders across their full range. Pushing a slider to its end simply stops having an effect past that point.
Operators
| Tone mapper | Notes |
|---|---|
| AgX | Troy Sobotka's AgX, using Benjamin Wrensch's real-time implementation. Evaluated in linear sRGB and converted back to AP1. |
| Reinhard | x / (1 + x). |
| Uncharted 2 | John Hable's filmic curve; white point 11.2, exposure bias 2.0. |
| GT (Uchimura) | Hajime Uchimura's 2017 published curve. Not Polyphony Digital's Gran Turismo 7 transform, which has never been released. |
| Khronos PBR Neutral | The Khronos Group's PBR Neutral tone mapper, designed to keep base colours close to their reference. |
| Lottes | Timothy Lottes' curve, anchored at middle grey. |
Performance
The tone curve is evaluated while Unreal builds its colour-grading LUT, not per pixel. The plugin's modules are UncookedOnly and Editor, so neither is included in packaged builds.
Known limitations
- HDR highlights are expanded, not re-derived. On UE 5.0 to 5.7, on Unreal's ACES 1000 and 2000 nit HDR output devices (PQ and scRGB), your tone mapper's curve is what shapes the image. Where a pixel's brightest colour channel is below four fifths of SDR white, the picture is the same as the SDR picture from the same tone mapper; above that, pixels are brightened on a smooth curve, measured in stops, towards the output's peak. The expansion is monotonic, so values the curve maps to different levels stay different; anything the curve clips to white stays white and is brightened as white. Very saturated highlights can read above the peak after Unreal's colour conversion. On UE 5.8 the plugin adds nothing to HDR: the curve you pick feeds Epic's own HDR path, which does the expansion while Film → Method is Filmic; that is read from Unreal's shader and was not tested. Measured on UE 5.0, 5.6 and 5.7 only (1000 nit PQ output) and not viewed on a physical HDR display; the full testing limits are under HDR output.
- Auto-exposure on UE 5.6 and later meters through Epic's Filmic curve (
PostProcessHistogramCommon.ush) rather than the selected tone mapper. - Windows only. Tested in SDR with Epic Games Launcher engine installs. Engines built from source have not been tested.
Automation tests
Eight tests ship with the plugin. Run them from the editor console:
Automation RunTests EasyTonemapper
They check that a patch round-trips back to byte-identical stock, that the patched file is self-contained, that unsafe shader code is refused, that settings survive a reload, that the HDR output branches are hooked on UE 5.0 to 5.7 (UE 5.8 needs no separate HDR hook), and that the anchors still match your installed engine. That last check reads the engine file only; no test writes to your engine.
Licence and credits
Copyright © 2026 SDProjects. Licensed under the Fab Standard License, which licenses plugins per user: each person using the plugin needs their own licence.
Easy Tonemapper builds on published work by Troy Sobotka (AgX), Benjamin Wrensch (real-time AgX), Erik Reinhard et al., John Hable, Hajime Uchimura, Timothy Lottes and the Khronos Group. Full attribution and licence texts are included with the plugin, in Source/ThirdParty/THIRD_PARTY_NOTICES.md and beside the code they cover under Source/ThirdParty.
Scenes shown on this page
Not included with Easy Tonemapper. The comparison images on this page were rendered in Unreal Engine 5.8 with third-party content, sold or provided separately. Easy Tonemapper includes the plugin and its test chart map only. In every comparison the scene, lighting and exposure are the same; only the tone curve changes (plus Blue Correction, off by default).
- Nordic Fishing Hut - Coastal Lakeside Cabin [Interior + Exterior] by Studio Fjuna, on Fab ↗
- Asian Canal Environment by Leartes Studios, on Fab ↗
- Modular Sci-Fi Indoor/Outdoor environment pack - Rocky Swampy Planet by JessyStorm's Assets, on Fab ↗
- Character: MetaHuman by Epic Games
Easy Tonemapper is not affiliated with or endorsed by Epic Games or the creators above.
Unreal® Engine, Copyright 1998 - 2026, Epic Games, Inc. All rights reserved. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere. MetaHuman is a trademark or registered trademark of Epic Games, Inc.