Desaturated/washed out colours in Unreal

Hi,

TL,DR:
How do you stop your colours in Unreal from being washed out? How do you make sure your whites are white?

I’m a VFX artist coming into the UE4 workflow having come from a game engine that has a much more straightforward WYSIWYG relationship between the colors we assigned in our color picker, and those that would appear on our particles in game.

In League’s engine, if I put a particle to be 100% opaque, and set it to a specific color, that would be the color I would see in game.
I’m struggling with Unreal because of the impact that the tonemapper has on the colors that I assign to the particles.

Please look at the attached image. I have created several different particle systems that spawn colored planes using different methods. All of these use unlit materials. On the left is a sprite where the color is created by a texture. It has sRGB disabled, so is in Linear space. As expected, it doesn’t quite look right, as it essentially has a gamma correction applied twice. On the right hand side, the same texture is used, but with sRGB enabled, looking correct.

In the centre, there is a mesh where the colours are derived from the vertex colors of the mesh. It uses the same values as the textures. It looks incorrect, appearing the same as the linear space texture. I assume that mesh vertex colors are in linear space.

Below the mesh, there are 3 rows of particles. The top (rainbow) and bottom (blue) row simply use the vertex colors to color the particles. The middle row uses a color curve driven by a dynamic parameter.

Similar to the mesh colors, these are messed up, I’m assuming because they’re in linear space too.

Below these, you can see the set of emitters repeated. These were setup the same as the particles above them, but in their materials I corrected the gammas of all the colors by giving each a power of 2.2. These mostly behave how i’d like (except obviously the sRBG one has now been gamma darkened twice and looks too dark).

On the right, you can see these examples duplicated. The middle set of emitters is the same as the left, but with the tonemapper set to 1 with a console command. The right side set of experiments is using a post process volume to replace the tonemapper in a post process material.

These experiments I did to try to understand better how the tonemapper is affecting my colors.

The workflow I’m used to is one where we would make use of a lot of uncolored textures, and then use the particle colors or color curves to recolor particles. This means we could work in an optimized fashion with relatively fewer textures.

I have a few main issues that i’m trying to overcome.

  1. When Unreal is blending colors in linear space, it is giving undesired colors. Note how emphasized the pink and orange colors are when it’s blending between the red and blue.

  2. It’s really hard to pick the actual colors that I want on my particles, even using the little sRGB preview box, as I can’t click on the color I want in the color wheel, instead I have to just fiddle with the settings until I get the color I want in the preview. This is frustrating and really slows me down. As an artist, I really want to be working in as close to a WYSIWYG way as possible

  3. Whites in my unlit particles are not close to being actually white. I’ve investigated this a reasonable amount. As I understand it, Unreal is attempting to work in a physically correct way, where white would only be displayed if my particle was the brightest thing in the scene. Since Unreal is trying to accomodate HDR, this means that there’s actually a very wide range of values for brightness, and simply setting my material to white won’t make it white in the render. I can multiply my emissive channel by a variable to make it brighter, but this will make stuff bloom more, and will also make my particles less saturated, due to it being “physically correct” that things get paler as they get brighter.

So from this I have a few questions:

  1. When we import a texture with color information we tick sRGB so that the colors will appear how we expect in Unreal. Is there any similar setting for mesh vertex colors, particle colors, or color curves?

  2. If not, Is it an expectation that if wanted to use the colors from the color picker, that I would put a power of 2.2 in the shaders I’m using? My understanding is that this is pretty expensive, and you have to do a simpler/less accurate method for mobile. Is there an alternate color picker where I select the colors I want, and it does all the color conversion behind the scenes?

  3. In a situation where I wanted the screen to display white (i.e. 255,255,255), such as for the UI, or for example a particle that appears above a character’s head that shows a status effect, how would I go about that? Is there a way to exclude something from the tonemapper? I don’t really want to request that we turn off the tonemapper entirely as it’s useful and the environment and character team has authored all their assets to work around it, but I also really want to be able to have control over how my particles appear, as VFX can be used to convey important gameplay information.

Sorry for this long post, but I’d really appreciate if someone could help me out, even if it is just to understand how the systems work better.

2 Likes

Generally you don’t have that much control over pixel color.

The emissive workflow is like telling the engine, this object is shining with this color at this intensity (linear, because it is essentially data), and the engine tries to deal with that in a way that looks believable to the observer (gamma corrected). That’s what the tonemapper/postprocessing/etc is for, and that part is usually completely out of vfx’ control. (Which can be extremely frustrating, I won’t lie)

This might seem like a weird workflow, but remember that light in the real world doesn’t work as an absolute. Your eyes change and adjust and interpret light differently in a different context.


As for UI, I believe unreal renders slate without the tonemapper, so if you want white text there, you should just be able to set it to float4(1,1,1,1) and it should just send white to the screen.
-Although even that doesn’t really guarantee that white is the end result.
-Also, slate doesn’t support particle rendering. (I think there’s a plugin)


Lastly, to have the picker color align with final result is quite difficult I think. You would have to apply the tonemapper and post processing to the color picker somehow.
*Maybe there is a plugin that can do that? :thinking:


Ah, there’s also auto exposure to mess with your final particle color, there’s a node called EyeAdaptation that can help you compensate for that.

I’m having issues along these same lines, and I’ve been trying to find a work around. It’s late right now so I’ll have to look into this more tomorrow morning. For now, try entering r.TonmapperFilm = 0 into your console command line ( ` ) with your project playing and see if that gives you a closer result to what you’re expecting.

I really hate how hard you have to fight against UE4’s tonemapper and post process when trying to create saturated, color LUT dependent effects. And you still never get exactly what you expect to be the result. I really hope Epic adds some kind of check box setting in at some point to enable artist to easily make the stylized effects that so many people are trying to create in their engine right now :frowning:

Hey beardilocks,

I remember that i fought with tonemapper few month ago to try to have an handpainted student project, and i found this link that helps me a bit https://www.artstation.com/artwork/ybrJgR to play with the tonemapper. Also the Eye adaptation/auto exposure was a pain to see the result that i wanted to have, i don’t know if it can help you, but i hope so :slight_smile:

Hey guys, thanks for your responses.

During my research I came to understand how the Unreal setup is more physically accurate, but it’s just tough to work with when you’re making stylized VFX, especially if you want control over the visual hierarchy in your scene.

If anyone in the future runs into a similar problem, these resources helped me to understand what was going on better:
http://www.artbyplunkett.com/Unreal/unrealgamma.html

https://youtu.be/PXcTaB5cAoM

Sadly I can’t turn the tonemapper off as it would affect the other teams on the project, and even with it off things don’t look exactly as I’d expect. A developer at Unreal told me that disabling it all can have other unintended impacts, as it disables a whole section of the post process, not just the Tonemapper itself.

Unfortunately I think that this is just a foible of Unreal that I’m going to have to learn how to best work around. One of the things I’ve been doing is just not using the color picker to actually “Pick” any values from the circle, as they won’t be correct, and instead just eyeballing the color in the sRGB preview by fiddling with the HSV values.

2 Likes