# How can I blend the center color of a 2 side gradient so it isn't as harsh looking in Unity Shader Graph?

I am using the gradient node in Unity's Shader Graph. It is 2 sided, with it being black-white-black. The white is quite harsh, it makes a line that stands out. I will be using this as a mask, and would like the white to not be so strong where it appears as a line. I don't know if this would be better to do outside of the gradient node or not.

I don't want to use an image (don't know how to create one), as I want more control in the shader.

Edit: I can add more points and make them less white to try and get a better blend, but this is very tedious and isn't perfect.

Here is what it currently looks like:

Here is what I want to achieve (even this is a little harsh, but closer to what I want):

I tried adding more points but still can't get it right:

What you're dealing with is an effect called Mach Bands. They come from our visual system highlighting the perceived contrast where two different greys meet, or where a gradient changes direction:

The linear interpolation used by the gradient node makes a sharp corner at each colour key, and our visual system highlights that first derivative discontinuity as a bright or dark line - even though it's not actually that much brighter or darker than the pixels next to it.

So, we need to smooth-out this corner so our brains' local contrast detection sees it as a gradual rounded shape instead of a sharp corner to highlight.

Here are a few different ways you can solve it:

1. Top Row: More Keys

You've already started down this road. You just need more. In this example my keys go...

• 0%: 0
• 40%: 230
• 45%: 252
• 50%: 255
• 55%: 252
• 60%: 230
• 100%: 0

You can see how this rounds-out the peak to minimize the perceived corner:

For the next two solutions, I use some math to put the curving bend into the input parameter, rather than into the gradient. So we can switch to a simple one-sided linear gradient - we'll mirror it in our input math.

1. Middle Row: SmoothStep

Here I take our 0...1 gradient parameter and subtract 0.5, so it goes -0.5...0...0.5

Taking the absolute value of this gives us a V shape, 0.5...0...0.5

Then we run this through a node called "SmoothStep" - this takes an input parameter and remaps it using a min/max range, so that values at/below the min map to 0, values at/above the max map to 1, and smoothes the values in-between.

It's a kind of "ease-in-out" function, that slows the rate of change of the input as it reaches the extremes, so it comes to a gradual stop at the min/max instead of slamming into them at full speed.

You can see as a consequence, this also increases the amount of dark fringes you get at the left and right sides of the gradient, as we spend a bit more time slowly easing into the dark extreme.

Like before, we'll subtract 0.5 to get into the range -0.5...0...0.5

But instead of taking the absolute value to mirror the input at zero, we could instead multiply our parameter by itself, squaring it to get a positive number.

Unlike the absolute value function that makes a sharp corner at zero, this gives us a parabola that's smooth and flat at its vertex. We just need to multiply it by 2 first (or 4 afterward), to keep the output in the 0...1 range we want.

This both mirrors the gradient AND smoothes the corner in one step, but it has the opposite problem as SmoothStep: it spends most of its time in the bright values in the middle of our gradient, and just barely touches dark greys as it rushes to black at the edges.