stringtranslate.com

Paso suave

Un gráfico de las funciones smoothstep( x ) y smootherstep( x ), utilizando 0 como borde izquierdo y 1 como borde derecho

Smoothstep es una familia de funciones de interpolación y sujeción de tipo sigmoide que se utilizan comúnmente en gráficos de computadora , [1] [2] motores de videojuegos , [3] y aprendizaje automático . [4]

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

es idéntica a la función de sujeción :

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:

ecuación de quinto orden

Comenzando con una función polinomial genérica de quinto orden , su primera derivada y su segunda 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:

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

  1. ^ Smoothstep en la red de desarrolladores de Microsoft.
  2. ^ Especificación del lenguaje GLSL, versión 1.40.
  3. ^ Documentación del motor de juego Unity SmoothStep.
  4. ^ 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.
  5. ^ 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 .
  6. ^ Texturizado y modelado, tercera edición: un enfoque procedimental.
  7. ^ Ecuación general de paso suave.

Enlaces externos