Smoothstep

Wykres funkcji smoothstep i smootherstep z zerem jako wartością minimalną i jedynką jako maksymalną.

Smoothstep – rodzina sigmoidalnych funkcji powszechnie stosowanych w grafice komputerowej, silnikach gier wideo i uczeniu maszynowym.

Wartość funkcja smoothstep zależy od argumentu x oraz dwóch parametrów: „lewej krawędzi” i „prawej krawędzi” (przy czym przyjmuje się, że lewa krawędź jest mniejsza od prawej). Argumentem x jest liczba rzeczywista. Funkcja zwraca 0, jeśli x jest mniejsze lub równe lewej krawędzi, oraz 1, jeśli x jest większe od lub równe prawej krawędzi. W przeciwnym razie funkcja dokonuje płynnej (ang. smooth) interpolacji, wykorzystując interpolację Hermite'a, i zwraca wartość z zakresu od 0 do 1. Nachylenie funkcji smoothstep wynosi zero na obu krawędziach. Dzięki temu idealnie nadaje się ona do tworzenia gładkich przejść między wartościami – można stosować ją do interpolacji kolejnych segmentów zamiast korzystać z bardziej złożonych lub kosztownych technik interpolacyjnych.

W GLSL smoothstep implementuje interpolację Hermite’a stopnia trzeciego , po uprzednim ograniczeniu (clamping) argumentu. Przy założeniu, że lewa krawędź to 0, a prawa krawędź to 1, wzór ma postać:

Poniżej przedstawiono zmodyfikowany przykład implementacji w języku C/C++ udostępniony przez firmę AMD .

float smoothstep (float edge0, float edge1, float x) {
   // Scale, and clamp x to 0..1 range
   x = clamp((x - edge0) / (edge1 - edge0));

   return x * x * (3.0f - 2.0f * x);
}

float clamp(float x, float lowerlimit = 0.0f, float upperlimit = 1.0f) {
  if (x < lowerlimit) return lowerlimit;
  if (x > upperlimit) return upperlimit;
  return x;
}

Ogólna postać funkcji smoothstep (przy założeniu, że lewa krawędź to 0, a prawa krawędź ma wartość 1) to:

to funkcja zaciskająca (ang. clamping function)

Charakterystyczną krzywą sigmoidalną w kształcie litery S uzyskuje się za pomocą tylko dla dodatnich liczb całkowitych n. Stopień wielomianu wykorzystanego w funkcji wynosi 2n + 1. Dla n = 1 nachylenie (czyli pierwsza pochodna funkcji) jest równe zeru na lewej i prawej krawędzi (dla x = 0 i x = 1). Dla wyższych n, drugie i kolejne pochodne są równe zeru na krawędziach.

Przypisy

  1. ↑ Smoothstep at Microsoft Developer Network.
  2. ↑ GLSL Language Specification, Version 1.40.
  3. ↑ Unity game engine SmoothStep documentation.
  4. ↑ Natalya Tatarchuk: Advanced Real-Time Shader Techniques. 2003. s. 94. [dostęp 2022-04-16]. [zarchiwizowane z tego adresu (2021-05-30)].