Comme les vendeurs de pilotes GPU ne prennent généralement pas la peine de les implémenter noiseX
dans GLSL, je suis à la recherche d'un ensemble de fonctions utilitaires "graphiques aléatoires couteau suisse" , de préférence optimisé pour être utilisé dans les shaders GPU. Je préfère GLSL, mais le code de n'importe quelle langue fera pour moi, je suis d'accord pour le traduire moi-même en GLSL.
Plus précisément, je m'attendrais à:
a) Fonctions pseudo-aléatoires - Distribution uniforme à N dimensions sur [-1,1] ou plus de [0,1], calculée à partir d'une graine à M dimensions (idéalement n'importe quelle valeur, mais je suis d'accord avec la restriction de la graine à, disons, 0..1 pour une distribution uniforme des résultats). Quelque chose comme:
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) Bruit continu comme Perlin Noise - encore une fois, N-dimensionnel, + - distribution uniforme, avec un ensemble de valeurs contraint et, eh bien, bonne apparence (certaines options pour configurer l'apparence comme les niveaux de Perlin pourraient également être utiles). Je m'attendrais à des signatures comme:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Je ne suis pas très intéressé par la théorie de la génération de nombres aléatoires, donc j'opterais avec impatience pour une solution pré-faite , mais j'apprécierais également des réponses comme "voici un très bon rand 1D efficace (), et laissez-moi vous expliquer comment faire un bon rand à N dimensions () dessus ... " .
vec2 co
? est-ce la gamme? la graine?co.xy
est utilisé, au lieu deco
?Il me vient à l'esprit que vous pouvez utiliser une simple fonction de hachage d'entier et insérer le résultat dans la mantisse d'un flottant. IIRC, la spécification GLSL garantit des entiers non signés 32 bits et une représentation flottante binaire 32 IEEE, donc elle devrait être parfaitement portable.
J'ai fait un essai tout à l'heure. Les résultats sont très bons: il ressemble exactement à statique avec chaque entrée que j'ai essayée, aucun motif visible du tout. En revanche, l'extrait de code sin / fract populaire a des lignes diagonales assez prononcées sur mon GPU étant donné les mêmes entrées.
Un inconvénient est qu'il nécessite GLSL v3.30. Et bien que cela semble assez rapide, je n'ai pas quantifié empiriquement ses performances. L'analyseur de shader d'AMD revendique 13,33 pixels par horloge pour la version vec2 sur un HD5870. Contraste avec 16 pixels par horloge pour l'extrait de code sin / fract. C'est donc certainement un peu plus lent.
Voici ma mise en œuvre. Je l'ai laissé dans diverses permutations de l'idée pour faciliter la dérivation de vos propres fonctions.
Capture d'écran:
J'ai inspecté la capture d'écran dans un programme d'édition d'image. Il y a 256 couleurs et la valeur moyenne est de 127, ce qui signifie que la distribution est uniforme et couvre la plage attendue.
la source
Non, pas depuis 2005. C'est juste que les gens insistent pour télécharger l'ancienne version. La version qui se trouve sur le lien que vous avez fourni utilise uniquement des textures 2D 8 bits.
La nouvelle version par Ian McEwan d'Ashima et moi-même n'utilise pas de texture, mais tourne à environ la moitié de la vitesse sur les plates-formes de bureau typiques avec beaucoup de bande passante de texture. Sur les plates-formes mobiles, la version sans texture peut être plus rapide car la texturation est souvent un goulot d'étranglement important.
Notre référentiel source activement maintenu est:
https://github.com/ashima/webgl-noise
Une collection des versions sans texture et utilisant la texture du bruit est ici (en utilisant uniquement des textures 2D):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Si vous avez des questions spécifiques, n'hésitez pas à m'envoyer un e-mail directement (mon adresse e-mail se trouve dans les
classicnoise*.glsl
sources.)la source
glBindTexture(GL_TEXTURE_1D, *texID);
etc. Ce que vous entendez par "le lien que vous avez fourni" n'est pas clair, puisque vous citez ma réponse mais cette réponse n'était pas liée à votre implémentation. Je mettrai à jour ma réponse pour clarifier ce à quoi je fais référence et refléter les nouvelles informations que vous avez fournies. Qualifier les gens d '"insister" pour télécharger l'ancienne version est une distorsion qui ne vous fait pas honneur.Bruit d'or
Voir Gold Noise dans votre navigateur dès maintenant!
Cette fonction a amélioré la distribution aléatoire sur la fonction actuelle dans la réponse de @appas au 9 septembre 2017:
La fonction @appas est également incomplète, étant donné qu'aucune graine n'est fournie (uv n'est pas une graine - même pour chaque image), et ne fonctionne pas avec des chipsets de faible précision. Gold Noise fonctionne à faible précision par défaut (beaucoup plus rapide).
la source
Il y a aussi une belle implémentation décrite ici par McEwan et @StefanGustavson qui ressemble au bruit de Perlin, mais "ne nécessite aucune configuration, c'est-à-dire pas de textures ni de tableaux uniformes. Il suffit de l'ajouter à votre code source de shader et de l'appeler où vous voulez".
C'est très pratique, d'autant plus que l'implémentation antérieure de Gustavson, à laquelle @dep était lié, utilise une texture 1D, qui n'est pas prise en charge dans GLSL ES (le langage shader de WebGL).
la source
Utilisez ceci:
N'utilisez pas ceci:
Vous pouvez trouver l'explication dans Améliorations du rand () canonique à une ligne GLSL pour OpenGL ES 2.0
la source
mod
une approximation de pi?Je viens de trouver cette version de bruit 3D pour GPU, sans aucun doute la plus rapide disponible:
la source
Une version droite et dentelée de 1d Perlin, essentiellement un zigzag lfo aléatoire.
J'ai également trouvé du bruit 1-2-3-4d perlin sur le site Web du tutoriel inigo quilez perlin du propriétaire de shadertoy, et voronoi et ainsi de suite, il a des implémentations et des codes rapides complets pour eux.
la source
hash: De nos jours, webGL2.0 est là, donc les entiers sont disponibles dans (w) GLSL. -> pour un hachage portable de qualité (à un coût similaire à celui des hachages flottants laids), nous pouvons maintenant utiliser des techniques de hachage "sérieuses". IQ en a implémenté certains dans https://www.shadertoy.com/view/XlXcW4 (et plus)
Par exemple:
la source
Veuillez voir ci-dessous un exemple comment ajouter du bruit blanc à la texture rendue. La solution est d'utiliser deux textures: le bruit blanc original et le bruit blanc pur, comme celui-ci: bruit blanc wiki
Le fragment partagé contient le paramètre uNoiseFactor qui est mis à jour à chaque rendu par l'application principale:
la source
J'ai traduit une des implémentations Java de Ken Perlin en GLSL et l'ai utilisée dans quelques projets sur ShaderToy.
Voici l'interprétation GLSL que j'ai faite:
Je l'ai traduit de l'annexe B du chapitre 2 de Noise Hardware de Ken Perlin à cette source:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Voici une nuance publique que j'ai faite sur Shader Toy qui utilise la fonction de bruit affiché:
https://www.shadertoy.com/view/3slXzM
Parmi les autres bonnes sources que j'ai trouvées au sujet du bruit au cours de mes recherches, citons:
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
Je recommande vivement le livre des shaders car il fournit non seulement une excellente explication interactive du bruit, mais également d'autres concepts de shaders.
ÉDITER:
Pourrait être en mesure d'optimiser le code traduit en utilisant certaines des fonctions accélérées par le matériel disponibles dans GLSL. Mettra à jour ce post si je finis par faire cela.
la source