c++ perlin-noise random-seed

c++ - ¿La mejor manera de agregar semillas al ruido Perlin?



perlin-noise random-seed (1)

Como nadie va a escribir una respuesta de los comentarios, me estoy esforzando. Por favor upvote cuando estoy en lo correcto, comente cuando no :)

Hay varias implementaciones y código de ejemplo que (intenta) implementar el ruido Perlin. Primero, está la here del propio Ken Perlin.

Caso 1: Implementación de referencia de ruido mejorada

La función de ruido toma tres valores dobles y genera un valor. Cuando se genera un mapa de bits 2D utilizando x e y, y manteniendo constante z, se obtiene el conocido patrón de ruido Perlin. Cuando z varía entre 0.0 y 1.0, las nubes de ruido parecen "cambiar" lentamente. Así que un método de siembra que establece z, por ejemplo, z = 10.0 * seed , podría funcionar para "sembrar".

Otra forma de activar la función de ruido sería esta: si siempre obtienes ruido en un rango de [0.0; 64.0 [para x e y, se puede sembrar el ruido agregando un desplazamiento a x, y o ambos al llamar a la función de ruido: ruido (x + 64.0 * semilla, y + 64.0 * semilla).

Caso 2: Código de ruido Perlin estilo tutorial

Luego hay una here del ruido Perlin (adaptado y utilizado en muchos otros tutoriales de ruido Perlin) que tienen una función de ruido base como esta (pseudocódigo):

function Noise2(integer x, integer y) n = x + y * 57 n = (n<<13) ^ n; return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0); end function

Mi principal escepticismo provino de los números mágicos y la confianza de los autores de estas páginas que la fórmula conduce a un ruido distribuido uniformemente. Otros autores agregaron el valor semilla en algún lugar de esta fórmula.

La solución para agregar una semilla a este tipo de implementación de ruido de Perlin es escribir una función que distribuya uniformemente los valores de salida para los valores de x e y dados (y devolviendo el mismo valor para los mismos valores de x e y, por supuesto). Esta función se puede escribir utilizando Boost.Random (código no probado):

double Noise2(int x, int y) { uint32_t seeds[3] = { uint32_t(x), uint32_t(y), seed }; boost::mt19937 rng(seeds, seeds+3); boost::uniform_real<> dist(0.0, 1.0); boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(rng, dist); return die(); }

El generador de números aleatorios tiene algunos controladores, entre ellos uno que toma un rango de uint32_t que determina el estado inicial del RNG.

También hay bibliotecas que generan ruido coherente, como libnoise.sourceforge.net , que pueden ser de ayuda aquí.

Ruido simple

No pedí el ruido de Simplex, pero la única implementación (de Stefan Gustavson) que encontré utiliza una técnica similar (algunas tablas precomputadas) como la implementación de referencia de Ken Perlin, y podría sembrarse como en el caso 1 anterior. El comentarista Robinson mencionó la siembra al generar la tabla de consulta, pero no sé cómo funcionaría.

Estoy tratando de implementar la generación de ruido 2D Perlin en C ++, y algunas implementaciones que encontré no usan ninguna semilla ( here , here o here ). Otras implementaciones toman un valor semilla para obtener un ruido diferente dependiendo del valor del ruido.

Sin embargo, encontré un código de ejemplo en el que se agregó el valor de semilla a los parámetros de la función que calcula el valor de ruido para cada octava (consulte PerlinNoise :: Total () en el código vinculado). Otro utiliza una función de semilla 3D y usa el valor de semilla fijo como el valor de z (no pudo encontrar el ejemplo en este momento). Otros artículos sugieren usar otras funciones de ruido.

Así que mi pregunta sería, cuál sería la mejor manera de agregar un valor semilla a la generación de ruido Perlin. Dado el mismo valor de semilla, se deben generar los mismos valores de ruido. Si la solución fuera tener una función de ruido personalizada, me interesaría si pudiera implementarse utilizando Boost.Random (o las clases de la Biblioteca C ++ estándar de C ++ 11).

Edición: para responder a lo que quiero decir con "mejor" manera: ¿Cuál es la mejor manera que me da el ruido Perlin como se suponía que funcionaba, por ejemplo, una función de ruido degradado?