Articulo de referencia

Ruido simplex

Ruido simplex El ruido simplex es el resultado de una función de ruido n -dimensional comparable al ruido de Perlin (ruido "clásico"), pero con menos artefactos direccionales , ...

Ruido simplex

El ruido simplex es el resultado de una función de ruido n -dimensional comparable al ruido de Perlin (ruido "clásico"), pero con menos artefactos direccionales , en dimensiones superiores y con una menor carga computacional. Ken Perlin diseñó el algoritmo en 2001 [ 1 ] para abordar las limitaciones de su función de ruido clásica, especialmente en dimensiones superiores.

Las ventajas del ruido simplex sobre el ruido Perlin:

  • El ruido simplex tiene una menor complejidad computacional y requiere menos multiplicaciones.
  • El ruido simplex se escala a dimensiones más altas (4D, 5D) con un costo computacional mucho menor: la complejidad esO(norte2){\displaystyle O(n^{2})}paranorte{\displaystyle n}dimensiones en lugar de laO(norte2norte){\displaystyle O(n\,2^{n})}del ruido clásico. [ 2 ]
  • El ruido simplex no tiene artefactos direccionales perceptibles (es visualmente isotrópico ), aunque el ruido generado para diferentes dimensiones es visualmente distinto (por ejemplo, el ruido 2D tiene un aspecto diferente al de las secciones 2D del ruido 3D, y se ve cada vez peor para dimensiones más altas [ 3 ] ).
  • El ruido simplex tiene un gradiente bien definido y continuo (casi) en todas partes que se puede calcular de forma bastante económica.
  • El ruido simplex es fácil de implementar en hardware.

Mientras que el ruido de Perlin interpola entre los gradientes en los puntos finales de la hipercuadrícula circundante (es decir, noreste, noroeste, sureste y suroeste en 2D), el ruido simplex divide el espacio en símplices (es decir,norte{\displaystyle n}triángulos de dimensión ). Esto reduce el número de puntos de datos. Mientras que un hipercubo ennorte{\displaystyle n}dimensiones tiene2norte{\displaystyle 2^{n}}esquinas, un simplex ennorte{\displaystyle n}Las dimensiones tienen solonorte+1{\displaystyle n+1}esquinas. Los triángulos son equiláteros en 2D, pero en dimensiones superiores los símplices son solo aproximadamente regulares. Por ejemplo, el teselado en el caso 3D de la función es una orientación del panal disfenoidal tetragonal .

El ruido simplex es útil para aplicaciones de gráficos por computadora, donde el ruido generalmente se calcula en 2, 3, 4 o posiblemente 5 dimensiones. Para dimensiones superiores, las n -esferas alrededor de n - vértices simplex no están suficientemente densamente empaquetadas, lo que reduce el soporte de la función y la hace cero en grandes porciones del espacio.

Detalles del algoritmo

El ruido simplex se implementa con mayor frecuencia como una función bidimensional, tridimensional o cuatridimensional , pero puede definirse para cualquier número de dimensiones. Su implementación suele constar de cuatro pasos: sesgo de coordenadas, subdivisión simplicial, selección de gradiente y suma de núcleos.

Sesgo de coordenadas

Una coordenada de entrada se transforma utilizando la fórmula

incógnita=incógnita+(incógnita+y+)F,{\displaystyle x'=x+(x+y+\cdots )\cdot F,}
y=y+(incógnita+y+)F,{\displaystyle y'=y+(x+y+\cdots )\cdot F,}
,{\displaystyle \cdots ,}

dónde

F=norte+11norte.{\displaystyle F={\frac {{\sqrt {n+1}}-1}{n}}.}

Esto tiene el efecto de colocar la coordenada en una red A * n , que es esencialmente la disposición de vértices de un panal hipercúbico que ha sido aplastado a lo largo de su diagonal principal hasta que la distancia entre los puntos (0, 0, ..., 0) y (1, 1, ..., 1) se vuelve igual a la distancia entre los puntos (0, 0, ..., 0) y (1, 0, ..., 0).

La coordenada resultante ( x ' , y ' , ...) se utiliza luego para determinar en qué celda del hipercubo unitario sesgado se encuentra el punto de entrada, ( x b ' = floor( x ' ), y b ' = floor( y ' ), ...), y sus coordenadas internas ( x i ' = x 'x b ' , y i ' = y 'y b ' , ...).

subdivisión simplicial

Una vez determinado lo anterior, los valores de la coordenada interna ( x i ' , y i ' , ...) se ordenan en orden descendente para determinar en qué simplex del ortoesquema de Schläfli sesgado se encuentra el punto. Luego, el simplex resultante se compone de los vértices correspondientes a un recorrido ordenado de aristas desde (0, 0, ..., 0) hasta (1, 1, ..., 1), del cual hay n ! posibilidades, cada una de las cuales corresponde a una única permutación de la coordenada. En otras palabras, se comienza con la coordenada cero y se añaden sucesivamente unos comenzando con el valor correspondiente al mayor valor de la coordenada interna, hasta terminar con el menor.

Por ejemplo, el punto (0.4, 0.5, 0.3) estaría dentro del simplex con vértices (0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 1, 1). La coordenada y i ' es la mayor, por lo que se agrega primero. Luego le sigue la coordenada x i ' y finalmente z i ' .

Selección de gradiente

Cada vértice del simplex se suma a la coordenada base del hipercubo sesgado y se le aplica una función hash para generar una dirección de gradiente pseudoaleatoria. Esta función hash puede implementarse de diversas maneras, aunque lo más común es usar una tabla de permutación o un esquema de manipulación de bits.

Se debe tener cuidado al seleccionar el conjunto de gradientes que se van a incluir, para minimizar los artefactos direccionales.

Suma de núcleos

La contribución de cada uno de los n  +  1 vértices del simplex se factoriza mediante una suma de núcleos radialmente simétricos centrados alrededor de cada vértice. Primero, la coordenada no sesgada de cada uno de los vértices se determina utilizando la fórmula inversa.

incógnita=incógnita(incógnita+y+)GRAMO,{\displaystyle x=x'-(x'+y'+\cdots )\cdot G,}
y=y(incógnita+y+)GRAMO,{\displaystyle y=y'-(x'+y'+\cdots )\cdot G,}
,{\displaystyle \cdots ,}

dónde

GRAMO=11/norte+1norte.{\displaystyle G={\frac {1-1/{\sqrt {n+1}}}{n}}.}

Este punto se resta de la coordenada de entrada para obtener el vector de desplazamiento sin sesgo. Este vector de desplazamiento sin sesgo se utiliza para dos propósitos:

  • Para calcular el valor del gradiente extrapolado usando un producto escalar .
  • Para determinar d2 , la distancia al cuadrado hasta el punto .

A partir de ahí, la contribución sumada del núcleo de cada vértice se determina utilizando la expresión

(máximo(0,r2d2))4(Δincógnita,Δy,graduadoincógnita,graduadoy,),{\displaystyle {\big (}\max(0,r^{2}-d^{2}){\big )}^{4}\cdot {\big (}\langle \Delta x,\Delta y,\dots \rangle \cdot \langle \operatorname {grad} x,\operatorname {grad} y,\dots \rangle {\big )},}

donde r 2 generalmente se establece en 0,5 o 0,6: el valor 0,5 garantiza que no haya discontinuidades, mientras que 0,6 puede aumentar la calidad visual en aplicaciones para las que las discontinuidades no son perceptibles; 0,6 se utilizó en la implementación de referencia original de Ken Perlin.

Las aplicaciones en 3D y resoluciones superiores para la síntesis de imágenes texturizadas estaban cubiertas por la patente estadounidense 6,867,776 , siempre que el algoritmo se implementara utilizando las técnicas específicas descritas en cualquiera de las reivindicaciones de la patente, que expiró el 8 de enero de 2022.

Véase también

Referencias

  1. Ken Perlin, Hardware de ruido. En Notas del curso SIGGRAPH sobre sombreado en tiempo real (2001), Olano M., (Ed.). (pdf)
  2. Ken Perlin, Haciendo ruido. Basado en una charla presentada en GDCHardcore (9 de diciembre de 1999). (url)
  3. "Procesamiento de imágenes: ¿Por qué el aumento de la dimensión del ruido simplex lo borra?" . Computer Graphics Stack Exchange . Consultado el 10 de marzo de 2021 .
  • Artículo técnico breve con código fuente de Stefan Gustavson (PDF)
  • Demostración animada de ruido simplex de "lámina de goma" de Perlin
  • Otra implementación del ruido simplex en C++ (SimplexNoise1234)