Como los proveedores de controladores de GPU generalmente no se molestan en implementar noiseX
en GLSL, estoy buscando un conjunto de funciones de utilidad de "aleatorización de gráficos de navaja suiza" , preferiblemente optimizado para usar dentro de sombreadores de GPU. Prefiero GLSL, pero codifique cualquier lenguaje que me sirva, estoy de acuerdo en traducirlo por mi cuenta a GLSL.
Específicamente, esperaría:
a) Funciones pseudoaleatorias - N-dimensional, distribución uniforme sobre [-1,1] o sobre [0,1], calculada a partir de semilla M-dimensional (idealmente es cualquier valor, pero estoy de acuerdo con restringir la semilla a, digamos, 0..1 para una distribución uniforme de resultados). Algo como:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
b) Ruido continuo como el ruido de Perlin - nuevamente, distribución N-dimensional, + - uniforme, con un conjunto restringido de valores y, bueno, luciendo bien (algunas opciones para configurar la apariencia como los niveles de Perlin también podrían ser útiles). Esperaría firmas como:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
No estoy muy interesado en la teoría de la generación de números aleatorios, por lo que preferiría una solución prefabricada , pero también agradecería respuestas como "aquí hay un rand 1D muy bueno y eficiente (), y déjame explicarte cómo hacer un buen rand N-dimensional () encima ... " .
vec2 co
? es el rango? ¿semilla?co.xy
se usa, en lugar deco
?Se me ocurre que podrías usar una simple función hash de enteros e insertar el resultado en la mantisa de un flotador. IIRC, la especificación GLSL garantiza enteros sin signo de 32 bits y representación flotante binaria IEEE32, por lo que debe ser perfectamente portátil.
Lo intenté hace un momento. Los resultados son muy buenos: se ve exactamente como estático con cada entrada que probé, sin patrones visibles en absoluto. Por el contrario, el popular fragmento sin / fract tiene líneas diagonales bastante pronunciadas en mi GPU con las mismas entradas.
Una desventaja es que requiere GLSL v3.30. Y aunque parece lo suficientemente rápido, no he cuantificado empíricamente su rendimiento. Shader Analyzer de AMD reclama 13.33 píxeles por reloj para la versión vec2 en un HD5870. Contraste con 16 píxeles por reloj para el fragmento sin / fract. Entonces, ciertamente es un poco más lento.
Aquí está mi implementación. Lo dejé en varias permutaciones de la idea para que sea más fácil derivar sus propias funciones.
Captura de pantalla:
Inspeccioné la captura de pantalla en un programa de edición de imágenes. Hay 256 colores y el valor promedio es 127, lo que significa que la distribución es uniforme y cubre el rango esperado.
fuente
No, no lo hace, no desde 2005. Es solo que la gente insiste en descargar la versión anterior. La versión que se encuentra en el enlace que proporcionó utiliza solo texturas 2D de 8 bits.
La nueva versión de Ian McEwan de Ashima y yo no utiliza una textura, pero funciona a la mitad de la velocidad en plataformas de escritorio típicas con mucho ancho de banda de textura. En plataformas móviles, la versión sin textura puede ser más rápida porque la textura es a menudo un cuello de botella significativo.
Nuestro repositorio fuente activamente mantenido es:
https://github.com/ashima/webgl-noise
Aquí se encuentra una colección de las versiones sin ruido y de textura que usan ruido (usando solo texturas 2D):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Si tiene alguna pregunta específica, no dude en enviarme un correo electrónico directamente (puede encontrar mi dirección de correo electrónico en las
classicnoise*.glsl
fuentes).fuente
glBindTexture(GL_TEXTURE_1D, *texID);
etc. No está claro qué quiere decir con "el enlace que proporcionó", ya que cita mi respuesta pero esa respuesta no se vinculó a su implementación. Actualizaré mi respuesta para aclarar a qué me refiero y reflejar la nueva información que ha proporcionado. Caracterizar a las personas como "insistentes" en descargar la versión anterior es una distorsión que no le da crédito.Ruido de oro
¡Vea Gold Noise en su navegador ahora mismo!
Esta función ha mejorado la distribución aleatoria sobre la función actual en la respuesta de @appas a partir del 9 de septiembre de 2017:
La función @appas también está incompleta, dado que no se suministra semilla (uv no es una semilla, lo mismo para cada cuadro), y no funciona con conjuntos de chips de baja precisión. Gold Noise funciona con baja precisión por defecto (mucho más rápido).
fuente
También hay una buena implementación descrita aquí por McEwan y @StefanGustavson que se parece al ruido de Perlin, pero "no requiere ninguna configuración, es decir, no texturas ni matrices uniformes. Simplemente agréguelo al código fuente de su sombreador y llámelo donde quiera".
Eso es muy útil, especialmente dado que la implementación anterior de Gustavson, a la que @dep se vinculó, usa una textura 1D, que no es compatible con GLSL ES (el lenguaje de sombreado de WebGL).
fuente
Usa esto:
No uses esto:
Puede encontrar la explicación en Mejoras al canon de una línea GLSL rand () para OpenGL ES 2.0
fuente
mod
una aproximación de pi?Acabo de encontrar esta versión de ruido 3D para GPU, es una de las más rápidas disponibles:
fuente
Una versión recta y dentada de 1d Perlin, esencialmente un zigzag lfo aleatorio.
También he encontrado el ruido 1-2-3-4d de Perlin en el sitio web tutorial del propietario del sombreador de sombras inigo quilez perlin, y voronoi y demás, tiene implementaciones y códigos rápidos para ellos.
fuente
hash: Hoy en día, webGL2.0 está allí, por lo que los enteros están disponibles en (w) GLSL. -> para un hash portátil de calidad (a un costo similar al de los hashes de flotación feos) ahora podemos usar técnicas de hash "serias". IQ implementó algunos en https://www.shadertoy.com/view/XlXcW4 (y más)
P.ej:
fuente
Vea a continuación un ejemplo de cómo agregar ruido blanco a la textura renderizada. La solución es usar dos texturas: ruido blanco original y puro, como este: ruido blanco wiki
El fragmento compartido contiene el parámetro uNoiseFactor que se actualiza en cada renderizado por la aplicación principal:
fuente
Traduje una de las implementaciones Java de Ken Perlin a GLSL y la utilicé en un par de proyectos en ShaderToy.
A continuación se muestra la interpretación GLSL que hice:
Lo traduje del Apéndice B del Capítulo 2 de Noise Hardware de Ken Perlin en esta fuente:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Aquí hay una sombra pública que hice en Shader Toy que usa la función de ruido publicado:
https://www.shadertoy.com/view/3slXzM
Algunas otras buenas fuentes que encontré sobre el tema del ruido durante mi investigación incluyen:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Recomiendo encarecidamente el libro de sombreadores, ya que no solo proporciona una excelente explicación interactiva del ruido, sino también otros conceptos de sombreadores.
EDITAR:
Es posible que pueda optimizar el código traducido utilizando algunas de las funciones aceleradas por hardware disponibles en GLSL. Actualizaré esta publicación si termino haciendo esto.
fuente