Lets Talk Color Pickers - Part 2

General / 02 June 2019

Hey folks!

In my last blog post about color pickers, I was exploring a way to procedurally generate color charts based on an input color and exposing different variation sliders. Since then I got the chance to work on a Substance Source Signature Series which meant I got extensive time working with the node and I discovered some things I was not happy with.  Some revisions were made for the Source release, but these mainly related to removing the dependency on a px processor in order to work with the CPU engine better. What you see in that series is more of less the node I detailed in the previous blog, but CPU friendly. I do go through the inner workings of it during a live stream, so if your interested check that out or you can grab it directly from the .sbs files if you have a substance source subscription. https://youtu.be/jp2qOxJGzq8


Now however, I am doing another pass on the node. Giving it a big tidy up, making it more robust and reverting back to px processor based (A CPU friendly version is now on a switch, instead). Value and hue variance is done in two passes as before, except its now packaged with the node and inputs exposed. Additionally, there is a mask input to provide a way to blend back the input color, which is very helpful in making sure you don't stray from the original intention. I found I rarely used the saturation variation, so that's gone. Along with the seed offset sliders for each channel. In practice just having a single seed was more than enough and was barely used anyway.


The main problem I had was mostly to do with how I was generating samples. I was using the same value for both generating sample points with a tile generator and to dynamically control the output size of the color chart. This meant the sample counts grew exponentially and very quickly became noisy or nonsense data. So my first step was to fix this and generate a sensible number of samples points. This is now done with a 16x16 fx map so its super fast and much more understandable.

This did pose a new problem though, as when these samples upscale to full res, they were not interpolating correctly. So I also do my own linear interpolation during the upscale to ensure I get precise gradients between each value. Below are the sample points being linearly interpolated correctly.


Hopefully now the sample count is more understandable and intuitive. (Sorry for the .gif compression)


I was also unhappy with how the hue blending worked with low saturation colors. Previously I was forcing the Saturation to 1 with a HSL node in order to blend it back on top of the original color. While this does produce nice results, it had a weird side effect of brightening the overall values. Instead, I now convert to HSV, so when adding hue variance it will not affect the brightness. This is the default behavior for the node and means it will respect the original saturation correctly.


Of course, the hue variance slider remains. That is, how much to blend in the variation. And also the value variation and hue range sliders; How much to offset the value and hue respectfully. Except now that it is px processor based again, the hue offset is truly random, rather than a blend between two extremes.


As before, you can choose to blend the hue back on top instead of preserving Saturation, which now feels nicer with the HSV and sample changes. As you expect, some colors are better suited for this than others.


I also found soft light in particular has nice results, so that's available as well.


The graph independent seed also remains, which with the high hue values, allows for some really interesting colors!


Thanks for reading!