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 una menor sobrecarga 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:
Mientras que el ruido clásico interpola entre los gradientes en los puntos finales de la hipercuadrícula circundante (es decir, noreste, noroeste, sureste y suroeste en 2D [ cita requerida ] ), el ruido simplex divide el espacio en símplices (es decir, triángulos -dimensionales). Esto reduce la cantidad de puntos de datos. Mientras que un hipercubo en dimensiones tiene esquinas, un símplice en dimensiones solo tiene esquinas. Los triángulos son equiláteros en 2D, pero en dimensiones superiores los símplices son solo aproximadamente regulares. Por ejemplo, el mosaico en el caso 3D de la función es una orientación del panal de abejas difenoide tetragonal .
El ruido simplex es útil para aplicaciones de gráficos por computadora, donde el ruido se calcula generalmente en 2, 3, 4 o posiblemente 5 dimensiones. Para dimensiones mayores, las n -esferas alrededor de las n - esquinas simplex no están lo suficientemente compactas, lo que reduce el soporte de la función y la vuelve cero en grandes porciones del espacio.
El ruido simplex se implementa más comúnmente como una función bidimensional, tridimensional o cuatridimensional , pero se puede definir para cualquier número de dimensiones. Una implementación generalmente implica cuatro pasos: sesgo de coordenadas, subdivisión simple, selección de gradiente y suma de kernel.
Una coordenada de entrada se transforma utilizando la fórmula
dónde
Esto tiene el efecto de colocar la coordenada en una A*
nred, que es esencialmente la disposición de los 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 ( xb ' = floor( x '), yb' = floor ( y ' ) , ... ) , y sus coordenadas internas ( xi ' = x ' − xb ' , yi ' = y ' − yb ' , ... ).
Una vez determinado lo anterior, se ordenan decrecientemente los valores de la coordenada interna ( x i ' , y i ' , ...) para determinar en qué ortosquema de Schläfli se encuentra el punto. Entonces el simplex resultante está compuesto por los vértices correspondientes a un recorrido ordenado de aristas desde (0, 0, ..., 0) hasta (1, 1, ..., 1), del que existen n ! posibilidades, cada una de las cuales corresponde a una única permutación de la coordenada. En otras palabras, se empieza con la coordenada cero y se van sumando sucesivamente comenzando en el valor correspondiente al valor de la coordenada interna mayor, terminando con el menor.
Por ejemplo, el punto (0,4, 0,5, 0,3) se encontraría dentro del símplex con vértices (0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 1, 1). La coordenada y i ' es la más grande, por lo que se suma primero. Luego le sigue la coordenada x i ' y, por último, z i ' .
Cada vértice simple se vuelve a sumar a la coordenada base del hipercubo sesgado y se convierte en una dirección de gradiente seudoaleatoria. El hash se puede implementar de varias maneras, aunque la mayoría de las veces se utiliza una tabla de permutación o un esquema de manipulación de bits.
Se debe tener cuidado al seleccionar el conjunto de gradientes a incluir, para mantener los artefactos direccionales al mínimo.
La contribución de cada uno de los n + 1 vértices del símplex 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
dónde
Este punto se resta de la coordenada de entrada para obtener el vector de desplazamiento no sesgado. Este vector de desplazamiento no sesgado se utiliza para dos propósitos:
A partir de ahí, la contribución del núcleo sumado de cada vértice se determina utilizando la expresión
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 en las que las discontinuidades no son perceptibles; 0,6 se utilizó en la implementación de referencia original de Ken Perlin.
Los usos de implementaciones en 3D y superiores para la síntesis de imágenes texturizadas estaban cubiertos por la patente estadounidense 6.867.776 , si el algoritmo se implementaba utilizando las técnicas específicas descritas en cualquiera de las reivindicaciones de la patente, que expiró el 8 de enero de 2022.