preserve sRGB colors with this one weird trick
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.
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.
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??
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?
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
) on top of your render, that emoji will also be affected by the view transform and 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.
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!!
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.
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))
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!!