SDPROJECTSFab Store

PLUGIN DOCUMENTATION

Easy Tonemapper

Change Unreal's tone mapper from the toolbar — AgX, Khronos PBR Neutral and four other proven curves — while your Post Process Volume colour grading keeps working.

  • ENGINE VERSIONSUnreal Engine 5.0 – 5.8
  • PLATFORMWindows (editor)
Easy Tonemapper cover art: a sphere split diagonally, each half rendered through a different tone mapper.
On this page

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. The one exception is Blue Correction, an ACES-specific adjustment, which is switched off by default (see Settings).

The included test chart: rows of red, orange, green, blue and white glowing spheres, each column four times brighter. Under Filmic, bright red turns orange and yellow and bright blue turns pale cyan; under AgX Punchy each colour keeps its hue as it fades towards white.
The included test chart under Unreal's default Filmic (left) and AgX – Punchy (right). Each column is two stops brighter than the one before. Exposure is fixed and bloom is off.

Is it right for your project?

Likely a good fit if

  • your project is on UE 5.0 – 5.7, where 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 want to match the look of Blender's AgX
  • you do product or archviz work where colours need to stay true (Khronos PBR Neutral)

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
  • you need HDR output. It isn't supported yet, but it's planned for an upcoming update (see Roadmap)

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. Unreal offers no way for a plugin to change its tone mapper and keep its own colour grading without editing this file. The original is backed up first and restored when you close the editor, or at the next launch after a crash. 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 changes nothing.
  • 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

  1. Install the plugin from Fab (or copy the EasyTonemapper folder into your project's Plugins folder), enable it in Edit → Plugins, and restart the editor.
  2. 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
  3. 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.

The Easy Tonemapper menu: How To Use text, a Tone Mapper drop-down set to Lottes, a Fine-Tuning guide describing the Film sliders for Lottes, and Options with Restore Engine Defaults and Advanced Settings.
The Easy Tonemapper menu with Lottes selected. Fine-Tuning always describes the tone mapper that's active.

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 the tone mapper is the only thing that changes.

  1. In the Content Browser, open Settings and tick Show Plugin Content.
  2. Open Easy Tonemapper Content → Demo → Maps → ToneMapperTestChart.
  3. 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 mapperChoose it when
Engine Default (Filmic)You want stock Unreal. The engine file is left identical to a clean install.
AgX – NeutralYou want AgX without a creative look. The best place to start.
AgX – GoldenYou want AgX with a warm, slightly desaturated look.
AgX – PunchyYou want AgX with more contrast and saturation.
ReinhardYou want a simple reference curve to compare against.
Uncharted 2 (Hable)You want a classic game-style filmic curve.
GT (Uchimura)You want the most control over shadows, midtones and highlights.
Khronos PBR NeutralColours must stay true to a real reference — archviz, product shots.
LottesYou want a simple curve anchored at middle grey, without a strong look.

Reinhard, Uncharted 2, GT and Lottes keep very bright, saturated lights fully 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. 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. For AgX, for example:

Film sliderWhat it does with AgX
SlopeBrightness. Higher is brighter.
ToeMidtones and shadows. Higher is darker and punchier.
ShoulderSaturation. Higher is more colourful.
Black clipShadows. Higher turns shadows black sooner.
White clipHighlights. Higher keeps more highlight detail but 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.

SettingDefaultWhat it does
TonemapperEngine DefaultThe active tone mapper.
Map Film Sliders To OperatorOnLets the Film sliders adjust the active tone mapper.
Disable Blue CorrectionOnTurns 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, so the packaged game looks the same as the editor. The plugin's code is not included in packaged builds.

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.

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 ... engine version is probably not supported yet"

This engine version isn't supported. Nothing was changed.

"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; Standard ACES is left untouched.

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

  1. Choose Restore Engine Defaults from the Easy Tonemapper menu.
  2. Close the editor.
  3. Delete the EasyTonemapper plugin folder (or uninstall it through the Launcher). You can also delete Saved/EasyTonemapper and Config/DefaultEasyTonemapper.ini from your project.

Roadmap

Planned updates (none of these are included in the current version):

  • HDR output.
  • 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 that matches Blender's default look, so scenes look the same in Blender and Unreal.

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:

  1. Post Process Volume grading (ColorCorrectAll: white balance, saturation, contrast, gamma, gain, offset) runs in scene-referred linear space.
  2. The tone curve runs — FilmToneMap for Filmic.
  3. A user Color Grading LUT, if any, is applied to display-referred values.

Easy Tonemapper replaces the call in step 2. Steps 1 and 3 are unchanged, and so are Tone Curve Amount and the 5.8 Standard ACES path.

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::ReplacingTonemapper does 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 the only way to change it while keeping Unreal's own grading path.

What changes in the engine file

The plugin edits PostProcessCombineLUTs.usf in place:

  • The call FilmToneMap( ColorAP1 ) is rerouted to EasyTonemapper_ToneMap( ColorAP1 ).
  • The two Blue Correction lines are scaled by a define, so the setting can switch it off.
  • 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 each anchor appears exactly once, 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 more than once, for example on an unsupported engine version, nothing is written.
  • 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.
  • Standard ACES 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 mapperSlopeToeShoulderBlack clipWhite clip
AgX (all three looks)Look slope (gain)Look powerLook saturationExposure floor, 8 stops across the sliderExposure ceiling, 8 stops across the slider
Reinhard, Uncharted 2Exposure into the curve
GT (Uchimura)Contrast aToe curvature cLinear section start mBlack lift, up to 0.25Peak brightness P
Khronos PBR NeutralHighlight desaturationCompression start
LottesContrast aRoll-off strength 1 − dBrightest 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 mapperNotes
AgXTroy Sobotka's AgX, using Benjamin Wrensch's real-time implementation. Evaluated in linear sRGB and converted back to AP1.
Reinhardx / (1 + x).
Uncharted 2John 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 NeutralThe Khronos Group's PBR Neutral tone mapper, designed to keep base colours close to their reference.
LottesTimothy Lottes' curve, anchored at middle grey.

Performance

The tone curve is evaluated while Unreal builds its colour-grading LUT, not per pixel, so the per-pixel cost is the same as Filmic. The plugin's modules are UncookedOnly and Editor, so neither is included in packaged builds.

Known limitations

  • SDR output only for now. HDR output is planned (see Roadmap).
  • 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 with Epic Games Launcher engine installs; engines built from source have not been tested.

Automation tests

Seven 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, 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.

Unreal® Engine is a trademark of Epic Games, Inc.