preserve sRGB colors with this one weird trick

2026-10-03

Color is weird and hard, because it involves a lot of nonlinearities going from electrical signal to brightness and color and whatnot. You probably know this already. If you're a Blender artist you've definitely run into a situation where you have created your fursona and made textures with your sona's color scheme, and then you hit render and uh oh all the colors are washed out!! what gives??

That would be due to tone mapping which in broad strokes is to convert a set of color values to another. A more specific kind is a view transform, which is responsible for converting colors to what will be shown on a display, hence viewed. Or something like that, this isn't going to be super technical so you can find better explanations elsewhere, probably.

Anyways, the default view transform in Blender used to be Filmic from version 2.8 up to 4.0 which added the new default AgX. These view transforms do a good job of compressing the high dynamic range of colors into something viewable on a normal (non-HDR) display, but there are of course sacrifices made.

For instance, say your sona is charizard and you've given them a nice orange material, but in the rendered view its like someone pulled the saturation slider down and nudged the hue a bit. If you color pick the values you find that this is indeed the case.

Charizard head viewed with solid colors on the left, render view on the right. The render view is noticeably desaturated.

So, if Filmic was replaced by AgX that must mean AgX is better right?? And yes, AgX is overall better at giving a nice look which you can read about somewhere else, but it still has that wash out effect that is undesirable for fursonas. The hue is noticeably better but the saturation still takes a hit.

Charizard head viewed with solid colors on the left, render view on the right. The render view is noticeably desaturated, but less hue shifted.

The "duh obvious" answer is to use the "Standard" view transform instead, which claims to use the display's standard transform with no extra mapping. Wow okay! There's Our Colors!! Why Weren't We Just Doing This The Whole Time??

Charizard head viewed with solid colors on the left, render view on the right. The colors match pretty well.

When I started using Blender, "Standard" was the default view transform (it was literally named "Default" in the interface too!) so I didn't really run into this or even know about it until i tried 2.8 and noticed colors were a little more.. boring than i was used to. Of course, i fixed it by setting Standard as the view transform and saving the setting to my startup file, so I would never need to worry about it again c:
That is, until I started making a lot of renders

You see, a sunny day is actually *REALLY* bright (I can confirm this after going outside), with brightness values that are even brighter than your classic 255,255,255. So what do you get when you have very bright colors on a character and try putting them outside on a sunny day?

Nezzucho from Legendz sitting on a dirt path and eating chips. A blue fat dragon is approaching from behind.

Yeah they get sunburnt very badly. Turns out that the Standard view transform isn't very good at dealing with colors that are brighter than full white, those values are essentially and literally just clipped, leading to ugly overexposed areas. At the time I viewed this as preferable to having ugly washed out colors, so I kept using Standard for a good while, until I eventually figured out a Weird Trick to get a nice compromise between Standard and Filmic.

When you save a render to a non HDR format like png or jpg, the view transform is applied to the data and the colors you see on screen are saved as sRGB (very shrimply spoken). So you can use Filmic, save the render, then switch to Standard and save another render. Now you have two puh-ngs with different colors. So you can just load both up in your image editor and mix between them until you find a nice blend.

This was extremely stupid but literally was what I did for a lot of renders for a very long time and when AgX came out I even had to save three different puhngs!!! Eventually I got more into using the compositor for what it's there for, and with the viewport compositor it was possible to WYSIWYG the colors more or less as you were workin on the scene which is very epic and yes.

but what if compositing and srgb

So compositing is really cool, and view transforms like AgX are desirable to compress high dynamic range, but the view transform is something that happens on top of everything. If you use the compositor to splap an image (e.g. a grinning cat) on top of your render, that emoji will also be affected by the view transform and washed out:

Synth tongue curl render with cat emoji composited on top. The emoji is washed out.

But setting the view transform to Standard affects the colors of the render, which we don't want. We essentially want Standard for the emoji, but AgX for the render.

Synth tongue curl render with cat emoji composited on top. The emoji has preserved colors, but the render now has overexposed areas.

You might think that setting the emoji's color space to the View Inverse "AgX base sRGB" helps, and while yes the hue and saturation matches a bit better now, the brightness is still off. Plus, changing the color space for the image datablock affects every other usage of the image in the file as well, and means you will have to do this with every image you bring into the compositor - not good!!

Synth tongue curl render with cat emoji composited on top. The emoji looks a bit closer to how it should, but the brightness is lacking.

The Convert To Display Node Saves The Day

Blender 5.0 saw the addition of the Convert To Display node, which performs the view transform. So, we can now use the Standard view transform as the file's overall transform so we get the colors we expect from regular images, and then we can ourself decide when to perform the AgX (or any other) view transform in the compositing nodegraph.

To use this in practice, you need to follow up the Convert to Display node with a Convert Colorspace that takes the sRGB and turns it back into the working space. I found this out by just trying shit until something worked but it makes sense, i think.

Compositor node graph showing the two nodes necessary.

Finally, the cat emoji is there in all its glory as well as the render not having clipped color values. And you can even do the extremely stupid thing I was doing earlier of mixing between a filmic/agx and a standard colors by simply using a mix node. It feels a lot less stupid when you can do it right in blender (because this means repeatability and also makes it feasible for animation renders (and also lets you keep your workflow more inside blender but That's A Post for Another Time))

Synth tongue curl render with cat emoji composited on top. The emoji has its proper colors, and the render has its AgX view transform applied

Applying the view transform early and doing the rest of the compositing in like sRGB/standard color space (this isn't exactly what happens but don't worry about it) also helps wonders with things as simple as "putting white text on the image somewhere". full white would always turn into a light gray when going through view transforms, so now we don't have to do that anymore. And that's really cool because you can use the compositor to put text on without leaving blender (but again that's more for a post for another time)

Thanks for coming to my talk about colors and my particular stupid way of handling them. Speaking of stupid, another stupid way I have of checking colors is that I have three different displays on my main machine, each completely different and the colors don't match exactly between all of them. So when I finish a render and have adjusted colors I just drag the window over to the other displays and see if any colors look particularly bad or not. Some day I should probably get an actual display calibrator and such but you don't really have to, you can just make shit up and if you think it looks nice and it looks nice on at least one of your other displays, it probably looks nice for other people!!