GLSL Functions

Definition of Smoothstep Function

By taking \(x^2\) we have a function that starts smoothly at \(0\) but ends rather harsh at \(1\). When we take the same function, push it one to the right and flip it arund we get \(-(x-1)^2\). By adding 1 we move the parabola to \(1\) and have a function with smooth ending.

When we now interpolate both functions

\[\begin{array}{rl}f(x) &= x^2\\g(x) &= 1-(x-1)^2\end{array}\]

we get a smooth function

\[\sigma(x) = f(x) \cdot (1-x) + g(x) \cdot x = x^2(3-2x)\]

Since we want the function to operate in \([0,1]\), we clamp the input value of \(x\):

\[x'=\max(0, \min(1, x))\]

Since the smoothstep function in GLSL has two ramp parameters \(a\) and \(b\), we shift the curve by \(a\) first:

\[x'=\max(0, \min(1, x - a))\]

The second ramp parameter \(b\) depends on the slope of the ramp, so

\[x'=\max\left(0, \min\left(1, \frac{x - a}{b-a} \right)\right)\]

which finally leads to the smooth step function:

\[\sigma(x; a, b):= \sigma\left(\max\left(0, \min\left(1, \frac{x - a}{b-a} \right)\right)\right)\]

The good thing is, if \(b < a\), the function flips over, which is exactly the behavior of the GLSL implementation.

Definition of Mix Function

\[\text{mix}(\mathbf{a}, \mathbf{b}, p) := \mathbf{a} + p \cdot (\mathbf{b} - \mathbf{a})\]

Definition of Step Function

\[\text{step}(\mathbf{a}, \mathbf{b}) := \mathbf{a}\leq\mathbf{b}\text{ ? }\mathbf{1} : \mathbf{0}\]

Smooth Staircase

Let \(\sigma : [0, 1]\to[0,1]\) be a step function with \(\sigma(x)=0\) \(\forall x<\epsilon\) and \(\sigma(x)=1\) \(\forall x>1-\epsilon\). A smooth staircase with step size 1 is then

\[\Gamma(x) = \sigma(x - \left\lfloor x\right\rfloor) + \left\lfloor x\right\rfloor\]

If a given width and height of the steps is required, we can rescale \(\Gamma\) to get

\[\Gamma(x ; w, h) = h\cdot \Gamma\left(\frac{x}{w}\right) = h\cdot \left[\sigma\left(\frac{x}{w} - \left\lfloor \frac{x}{w}\right\rfloor\right) + \left\lfloor \frac{x}{w}\right\rfloor\right]\]

Alternative absolute function

As the absolute function \(f(x) = |x|\) has no derivative at \(x=0\), we can define \(f(x)\) as \(f(x) = \sqrt{x^2}\) and to smoothen the edge, we can introduce a shifting parameter \(\epsilon\geq0\):

\[f(x) = \sqrt{x^2+\epsilon}-\epsilon\]

Derivation of logical float functions

\[\begin{array}{rl}\text{not}(x) &:= 1 - x\\\text{and} (x, y) &:= x y\\\text{or} (x, y) &:= \text{not}(\text{and}(\text{not}(x), \text{not}(y))) = x + y - x y\\\text{xor} (x, y) &:= \text{or}(\text{and}(x, \text{not}(y)), \text{and}(y, \text{not}(x))) = x + y - 2 x y\\\text{implies}(x, y) &:= \text{or}(\text{not}(x), y) = 1 - x + x y\\x\text{ ? } y : z &:= x y + (1 - x) z = z + x(y - z)\\\end{array}\]

« Back to Book Overview