La función depende de tres parámetros, la entrada x , el "borde izquierdo" y el "borde derecho", asumiendo que el borde izquierdo es menor que el borde derecho. La función recibe un número real x como argumento y devuelve 0 si x es menor o igual que el borde izquierdo, 1 si x es mayor o igual que el borde derecho e interpola suavemente, utilizando un polinomio de Hermite , entre 0 y 1 en caso contrario. El gradiente de la función smoothstep es cero en ambos bordes. Esto es conveniente para crear una secuencia de transiciones utilizando smoothstep para interpolar cada segmento como una alternativa al uso de técnicas de interpolación más sofisticadas o costosas.
En HLSL y GLSL , smoothstep implementa la interpolación cúbica de Hermite después de la fijación :
Suponiendo que el borde izquierdo es 0, el borde derecho es 1, y la transición entre los bordes tiene lugar donde 0 ≤ x ≤ 1.
A continuación se muestra un ejemplo de implementación de C/C++ modificado proporcionado por AMD [5] .
float smoothstep ( float edge0 , float edge1 , float x ) { // Escalar y fijar x al rango 0..1 x = clamp (( x - edge0 ) / ( edge1 - edge0 ));devuelve x * x * ( 3.0f - 2.0f * x ); }abrazadera flotante ( flotante x , flotante límite inferior = 0.0f , flotante límite superior = 1.0f ) { si ( x < límite inferior ) devolver límite inferior ; si ( x > límite superior ) devolver límite superior ; devolver x ; }
La forma general para smoothstep , asumiendo nuevamente que el borde izquierdo es 0 y el borde derecho es 1, es
La característica curva sigmoidea en forma de S se obtiene solo para números enteros n ≥ 1. El orden del polinomio en el paso suave general es 2 n + 1. Con n = 1, las pendientes o primeras derivadas del paso suave son iguales a cero en el borde izquierdo y derecho ( x = 0 y x = 1), donde la curva se añade a los niveles constantes o saturados . Con un número entero mayor n , las derivadas segunda y superiores son cero en los bordes, lo que hace que las funciones polinómicas sean lo más planas posible y el empalme a los valores límite de 0 o 1 más uniforme.
Variaciones
Ken Perlin sugirió [6] una versión mejorada de la función de paso suave de primer orden, que se usa comúnmente y que es equivalente al segundo orden de su forma general. Tiene derivadas de primer y segundo orden cero en x = 0 y x = 1:
Implementación de referencia de C/C++:
float smootherstep ( float edge0 , float edge1 , float x ) { // Escalar y fijar x al rango 0..1 x = clamp (( x - edge0 ) / ( edge1 - edge0 ));devuelve x * x * x * ( x * ( 6.0f * x - 15.0f ) + 10.0f ); }abrazadera flotante ( flotante x , flotante límite inferior = 0.0f , flotante límite superior = 1.0f ) { si ( x < límite inferior ) devolver límite inferior ; si ( x > límite superior ) devolver límite superior ; devolver x ; }
Origen
ecuación de tercer orden
Comenzando con una función polinomial genérica de tercer orden y su primera derivada :
Aplicando los valores deseados para la función en ambos puntos finales:
Aplicando los valores deseados para la primera derivada de la función en ambos puntos finales:
Resolviendo el sistema de 4 incógnitas formado por las 4 últimas ecuaciones obtenemos los valores de los coeficientes polinómicos:
Esto da como resultado la función "smoothstep" de tercer orden:
Aplicando los valores deseados para la función en ambos puntos finales:
Aplicando los valores deseados para la primera derivada de la función en ambos puntos finales:
Aplicando los valores deseados para la segunda derivada de la función en ambos extremos:
Resolviendo el sistema de 6 incógnitas formado por las últimas 6 ecuaciones se obtienen los valores de los coeficientes polinómicos:
Esto da como resultado la función "smootherstep" de quinto orden:
ecuación de séptimo orden
Aplicando técnicas similares, se obtiene que la ecuación de séptimo orden es:
Generalización a ecuaciones de orden superior
Los polinomios de paso suave se generalizan, con 0 ≤ x ≤ 1 como
donde N determina el orden de la función polinómica resultante, que es 2 N + 1. Los primeros siete polinomios de paso suave, con 0 ≤ x ≤ 1, son
El diferencial de es
Se puede demostrar que los polinomios de paso suave que pasan de 0 a 1 cuando x pasa de 0 a 1 se pueden mapear simplemente a polinomios de simetría impar.
dónde
y
El argumento de R N ( x ) es −1 ≤ x ≤ 1 y se añade a la constante −1 a la izquierda y +1 a la derecha.
Una implementación de en Javascript: [7]
// Función smoothstep generalizada generalSmoothStep ( N , x ) { x = clamp ( x , 0 , 1 ); // x debe ser igual a o estar entre 0 y 1 var result = 0 ; for ( var n = 0 ; n <= N ; ++ n ) result += pascalTriangle ( - N - 1 , n ) * pascalTriangle ( 2 * N + 1 , N - n ) * Math . pow ( x , N + n + 1 ); return result ; }// Devuelve el coeficiente binomial sin uso explícito de factoriales, // que no se pueden usar con números enteros negativos function pascalTriangle ( a , b ) { var result = 1 ; for ( var i = 0 ; i < b ; ++ i ) result *= ( a - i ) / ( i + 1 ); return result ; }función abrazadera ( x , límite inferior , límite superior ) { si ( x < límite inferior ) x = límite inferior ; si ( x > límite superior ) x = límite superior ; devolver x ; }
Paso suave inverso
La inversa de smoothstep() puede ser útil al realizar ciertas operaciones en gráficos de computadora cuando se necesita revertir o compensar su efecto. En el caso de la ecuación de tercer orden, existe una solución analítica para la inversa, que es:
Esto surge como la inversa de , cuya serie de Maclaurin termina en , es decir y expresan la misma función. La expansión en serie de la inversa, por otro lado, no termina.
En GLSL:
flotante inverso_paso_suave ( float x ) { devolver 0.5 - sin ( asin ( 1.0 - 2.0 * x ) / 3.0 ); }
Referencias
^ Smoothstep en la red de desarrolladores de Microsoft.
^ Especificación del lenguaje GLSL, versión 1.40.
^ Documentación del motor de juego Unity SmoothStep.
^ Hazimeh, Hussein; Ponomareva, Natalia; Mol, Petros; Tan, Zhenyu; Mazumder, Rahul (2020). La capa de conjunto de árboles: la diferenciabilidad se encuentra con el cálculo condicional (PDF) . Conferencia internacional sobre aprendizaje automático. PMLR.
^ Natalya Tatarchuk (2003). «Técnicas avanzadas de sombreado en tiempo real». AMD . pág. 94. Archivado desde el original el 2021-05-30 . Consultado el 2022-04-16 .
^ Texturizado y modelado, tercera edición: un enfoque procedimental.