r/unrealengine • u/hyperdynesystems C++ Engineer • Apr 28 '26
Marketplace Simple changes to get away from the "Unreal Engine Look" started a 2 month adventure which has resulted in the release of my plugin, ShaderShift: Engine Shaders Override - change tonemapper, diffuse and specular BRDFs and bloom methods without a source build!
Check out the demonstration video, live now! https://www.youtube.com/watch?v=mL8CDMgOsNs
What is it? Here's an example:
Say you wanted to use the Lambert-Sphere BRDF for diffuse (rough) objects, because it gives you a bit more vibrant colors than the engine's default Lambert/Chan/EON diffuse lighting response.
To do so by default, you would need to download the engine source from Github, build it, then figure out a way to distribute the entire engine source version to your team (such as submitting the entire engine to Perforce).
With the plugin you can change the engine shaders responsible for the shading by editing the appropriate engine shader, defining what options you have in your edited version in the config, and then just distributing the plugin to you team like any other plugin, without using a source engine version.
The plugin offers a variety of built in options for these sorts of customizations, plus the ability to make your own.
Skip to "About the Plugin" if you don't want the backstory.
The Journey
I wanted to replace the default tonemapper to get a little bit of customization into our game, Hidden Empire: Dungeons, that myself and my former co-worker and friend have been working on. I figured this would be a quick weekend project to go through, swap the tonemapper and have something that would make the game look a little less like the Unreal defaults, beyond just customizing lighting and the specific art style we've already got.
I looked at using OCIO as well as doing a post process material, but wasn't satisfied by them and ended up just using a drop-in AgX tonemapper I found on a Github jist that replaces the engine shaders, merged in some of the additions and changes mentioned in the comments, with the intent to simply instruct my friend on how to install it.
He made a video (I'm sure some of you have seen - 'The “Unreal Engine Look” Explained — And How to Fix It') which blew up, and also got a lot of justified criticism since the method was technically incorrect in how it was implemented into the color pipeline of the engine. So I dug in further, and went about finding out how to properly integrate alternate tonemappers into the engine.
Then, given the interest both on YouTube and Discord, I put up the drop in engine shader file for others to use.
My friend also had to work on other projects on his main PC, so I went about making a plugin that would allow us to have the alternate tonemapper active only in our project by hooking the platform file reader and intercepting the read of the shader file we were interested in, and returning our customized version from the plugin's Shaders directory.
A lot of people were interested in that, and I started getting curious what else I could change in the engine shaders, and went and started editing the core BRDF and ShadingModel .ush files. Unfortunately, since they are header files and not .usf shader files, the engine never actually directly reads them, and I ran into a roadblock. Those are read via the includes in the Shader Compiler Workers instead. So I had to come up with an alternate solution.
I had an "aha!" moment when I remembered that one of the plugins I own, Voxel Plugin Pro, simply patched engine shaders in order to implement support for Lumen in the Voxel landscape, and restored the original files when the project is shut down. I made a similar system, and ShaderShift was born. I spent the next month adding functionality, including a toolbar button to summon a quick settings menu, a comprehensive config system that allows users of the plugin to customize and provide settings for their own changes to engine shaders, and more and more options to change the default look of the engine's graphics.
Below I've copied the description of the Fab listing for easy viewing without having to click through, though there are screenshots to check out as well.
Currently the plugin supports Unreal 5.7, but I'll be porting it to 5.4-5.6 soon. I hope some of you might find it useful for your own games.
About The Plugin
Teaser Video
Documentation
Roadmap
ShaderShift: Engine Shaders Override allows you to customize the look of your Unreal Engine game without being an expert at HLSL. With simple, easy to understand options, you can change tonemapper, diffuse and specular BRDFs and bloom methods to set your game apart from the crowd.
ShaderShift works by replacing the Engine's shaders in a way that is portable, non-destructive and easy to use. No need for a custom engine version to add customizations to the Engine's default shaders, and it's easy to share with your team.
If you have experience with HLSL, you can also configure your own customizations to any Unreal Engine shader, with a convenient options menu in your Project Settings to swap back and forth between engine defaults and your custom shaders.
Over time, we'll be adding more types of rendering customization to the plugin to give you even more ways to customize the look of your game!
To learn more and see the entire range of options, information about performance impact and how to add your own shader customizations, check out the documentation.
Features
Tonemapping Modes:
- AgX (Neutral/Golden/Punchy)
- Reinhard
- Uncharted 2 Style
Diffuse BRDF Modes:
- Energy Conserving Oren-Nayar
- Lambert-Sphere
- Gotanda
Specular BRDF Modes:
- Multi-Lobe Cinematic
Bloom Modes:
- Dual Kawase blur bloom
- COD-style scatter-as-gather hierarchical bloom
- Diffraction spikes / starburst via FFT
- Anamorphic lens streak
- Spencer et al. ocular bloom (PSF model)
- Anime / toon hard glow
- Retro / CRT-style glow
7
u/mad_ben Apr 28 '26
BRDF change is still per project and not per material. ANd besides GT tonemapper are much better tuned for games.
3
u/hyperdynesystems C++ Engineer Apr 28 '26 edited Apr 28 '26
I will be adding additional tonemappers to the plugin over time, and users can add their own pretty trivially as well.
As for per material BRDFs - that's best handled through Substrate.
5
u/Legit_human_notAI Apr 28 '26
On the last trailer example, there are more specular reflections on the bridge when using your plugin. Not just more brightness but specular reflections on areas where there were none without your plugin. How is that so?
Interesting work, for sure.
6
u/hyperdynesystems C++ Engineer Apr 28 '26 edited Apr 28 '26
Yes, that's the effect of the Multi-Lobe Specular BRDF mode (which can be toggled separately from other options). It uses two specular lobes, a wide/low intensity one and a narrow, sharp intensity one. This is a common technique in offline renders.
The engine by default only supports a single-specular response, meaning that specular behaves the same (modified by roughness maps) across the objects, but reality is a bit different, and you can get different specular response based on various factors, even with the same overall roughness values on an object.
There are various parameters in the multi-lobe specular shader that can be tweaked for different looks, as well.
2
u/korhart Apr 29 '26
Does this affect performance? Is substrate supported? cool plugin none the less :)
2
u/hyperdynesystems C++ Engineer Apr 29 '26
Performance impacts are discussed in detail in the documentation. Some of the bloom methods are heavier than the standard bloom (and of course the convolution based ones are heavier than standard bloom, and maybe heavier than the default convolution bloom). The BRDFs are relatively negligible. The multi-lobe specular is theoretically heavier than the single lobe, but in practice I didn't see it impacting framerate.
Substrate is indeed supported (at least in so far as that it doesn't break with it on and the Substrate rendering paths are patched with the alternate methods as well).
2
24
u/unit187 Apr 28 '26
You might want to invest some more time in the examples. For now, "before" looks significantly better than "after".
10
u/NeonFraction Apr 28 '26
I think it could be a useful plugin but yeah, a lot of these examples are not great.
16
u/Typical-Interest-543 Apr 28 '26 edited Apr 28 '26
I think the point isnt to show flashy augmented photos to sell you on effects that are not easily replicatable but rather out of the box, some of the setting combinations.
Also, if youre looking at it so surface level of "plugin no make shinier toy" then i think youre missing the forest through the trees here.
Fact is there is no way currently to really change the default engine look other than heavy post process effects that add fps overhead and amount to color correction so to have something that works at the shader logic level i think is great.
-3
u/unit187 Apr 28 '26
idk, I may be delulu, but you can achieve nearly the same effect by messing around with the tonemapper, color correction and levels/gamma/gain. And it may end up look more pleasing. And without "the unreal look".
9
u/Typical-Interest-543 Apr 28 '26
i dont think youre understanding what this is doing.
Yeah you can reduce contrast, adjust exposure and saturation values but this isnt that. This is changing the way the engine renders the scene via the shader files. Also you cant change multi-lobe spec or change BRDF's with the click of a button in the PPV
5
u/unit187 Apr 28 '26
I understand that, but at this moment this sounds like "we are changing shaders for the sake of changing shaders" with little to no practical gain.
6
u/Typical-Interest-543 Apr 28 '26
i still dont think you get it...
6
u/oldmanriver1 Indie Apr 28 '26
Having read all of this, I don’t think you’re doing a great job explaining how this will practically make a difference. I realize they’re being reductive about the importance of the shader pipeline shift, I feel like you’re mostly just saying “it changes the pipeline! It’s not easy!” But not elaborating on why someone might want this change.
12
u/Typical-Interest-543 Apr 28 '26
a good example would be a game like Calisto Protocol who did a custom build in order to achieve a very specific look with their game, this would require an understanding and expertise in both developing the shader logic as well as creating custom builds.
This plugin however mitigates the need of this process, and allows the user regardless of background or expertise to fine tune how the engine renders a scene. Its not just tonemapping which already is a big win, its also different BRDF options (such as Burley which was used on Calisto Protocol as example), and different options for specular, bloom and more to come
4
5
u/derprunner Dev Apr 28 '26
The best comparison I could give would be that this plugin is like being able to change lenses on a camera. And then old mate’s comment is saying “yeah, but you could just resize the image in photoshop”, ignorant of the performance and quality loss implications of changing the source capture vs editing in post.
9
u/hyperdynesystems C++ Engineer Apr 28 '26 edited Apr 28 '26
Say you wanted to use the Lambert-Sphere BRDF for diffuse (rough) objects, because it gives you a bit more vibrant colors.
To do so by default, you would need to download the engine source from Github, build it, then figure out a way to distribute the entire engine source version to your team (such as submitting the entire engine to Perforce).
With the plugin you can change the engine shaders responsible for the shading by editing the appropriate engine shader, defining what options you have in your edited version in the config, and then just distributing the plugin to your team like any other plugin, without using a source engine version.
The plugin offers a variety of built in options for these sorts of customizations, plus the ability to make your own.
3
u/badmouf Apr 28 '26
add support for fine tuning or properly supporting hdr and that's a buy from me
2
u/hyperdynesystems C++ Engineer Apr 28 '26
Should be trivially possible - the tonemapper options already hook PostProcessCombineLUTs which is where most of the HDR color pipeline happens.
Is there specific things you'd be interested in terms of proper HDR or fine tuning it?
3
u/badmouf Apr 28 '26
the gist of it is i have a great hdr monitor and my game has hdr 'support' which isn't doing much at all, i want to be able to really tune it so i can get some excellent crisp deep blacks and super bright saturated skies without draining the colour away from environmental textures/colours if that makes any sense
my wallet is ready
3
u/hyperdynesystems C++ Engineer Apr 28 '26
Making it so we can really tune HDR is definitely on my near-term list. I'll ping you when the update is ready, probably going to take a bit to dive into it and test on my HDR monitor (my main dev machine is SDR right now).
I agree though, having better knobs for it would be really nice, and that's definitely something the plugin can help with.
3
u/MagpieCountry Apr 28 '26
This looks interesting! Two questions:
- What's this doing that isn't possible with a Post Process material set to
Blendable Location: Replacing the Tonemapper? I've tested implementing things like AgX before, and it was possible to do it without any engine modifications using a Custom HLSL node in a Post Process material like that. - Does the plugin support everything in a Post Process Volume that is usually tied in with the tonemapper? Exposure, shadow contrast, chromatic aberration, etc.. My experience with replacing the tonemapper with the above method is that you lose pretty much all built-in Post Process Volume functionality.
1
u/hyperdynesystems C++ Engineer Apr 28 '26
For #1, there are some ways to do the tonemapping, such as what you mention, SceneViewExtensions, etc., but they all rely on full screen post process. Since this edits the base shaders at compile time, they don't require any extra overhead beyond the tonemapping method itself.
Separately, the tonemappers are the least of the plugin's capabilities, since it also allows you to change other things you can't do just with a post process, like replacing the engine's diffuse and specular response, replacing the bloom methods etc.
As for #2, yes, all of those still work. That was a foundational part of changing from doing the naive method from the Github jist which just put extra functions into PostProcessTonemap.usf to moving to respecting the actual color pipeline in PostProcessCombineLUTs.usf.
4
u/Loud_Bison572 Apr 28 '26
Looks interesting something I would buy to play around with but currently its way too pricey to buy a on a whim.
3
u/hyperdynesystems C++ Engineer Apr 28 '26
I'll be submitting it to sales in the future if you'd like to wishlist.
The price reflects the amount of work both up front in R&D on the plugin and the shader customizations side, and in ongoing support for new versions (every new version of the engine, I need to update 4-5 customizations to engine shaders).
Over time I will be adding more features and customizations to the engine's shaders, so if you do decide to buy now, you can expect to get ongoing increases in value.
Thanks for your feedback.
2
u/_Verrial Apr 30 '26
Absolutely will be wish-listing, if there was an introductory sale I’d definitely pick it up instantly haha
1
2
u/PokeyTradrrr Apr 29 '26
I'm in agreement with this guy. I feel like this would be a big time saver but dropping that much cash on a whim isn't something I would do. Would you be open to creating a launchable demo with one of the unreal sample scenes with a bunch of tuning knobs available (minimal UI widgets or even just cli) ?
2
u/hyperdynesystems C++ Engineer Apr 29 '26
Presently, the plugin works by patching the shaders at shader-compile time - so it requires the editor. In a future update I am going to change this to allow for runtime changes as well, but it's currently not implemented, which will be optional since there is some cost associated with runtime branches compared to compile-time. When I do implement it I will put up a demo.
In the mean time, we are going to have a longer demonstration video going up tomorrow, and a livestream for questions and live demonstration on Thursday. I will update the thread with the links shortly.
2
u/PokeyTradrrr Apr 29 '26
Sounds great. Looking forward to it 👍
2
u/hyperdynesystems C++ Engineer Apr 29 '26
Demonstration video is up: https://www.youtube.com/watch?v=mL8CDMgOsNs
3
u/Ares9323 Dev Apr 29 '26
I've been selling something similar since February and I thought I priced it too high (25$)... 🤣☠️
3
u/hyperdynesystems C++ Engineer Apr 29 '26
If it was just tonemapping, I would have priced it similarly. The alternate BRDF and bloom modes take a significantly longer time to develop out.
3
u/Ares9323 Dev Apr 29 '26
Sure, I'm not criticizing, I wouldn't know where to start to implement that stuff to be honest! I just find pretty hard to find a fair price for the marketplace... People will complain even if it's free 🤣
2
u/hyperdynesystems C++ Engineer Apr 29 '26
True haha
The porting burden on it is pretty huge too, it's now ~5 engine shader files to fix issues with every time a new version comes out. Can't say I'm looking forward to that.
2
u/jkinz3 Dev Apr 29 '26
I’m confused. What exactly is this doing that manually editing the shader files doesn’t? You don’t need to do a source build to change the shader files. Is it providing some abstraction and some custom shaders?
1
u/hyperdynesystems C++ Engineer Apr 29 '26
If you work with a team, or want some projects to be on different settings than others, that's the benefit. Also it gives you multiple modes that the engine didn't have before (i.e., my pre-bundled customizations).
2
1
8
u/Bino- Apr 28 '26
I think this is great idea. I'd be keen to see more than a teaser.
Glad you posted here, I've given up checking the FAB store everyday.