Le bruit avec OpenGL Perlin
-
27-09-2019 - |
Question
J'étudiait le bruit de Perlin à travers quelques exemples @ http://dindinx.net /OpenGL/index.php?menu=exemples&submenu=shaders et ne pouvait pas l'aide à l'avis que son make3DNoiseTexture()
dans les utilisations perlin.c
noise3(ni)
au lieu de PerlinNoise3D(...)
Maintenant, pourquoi est-ce? Ne Perlin est bruit censé être une sommation de différentes fréquences de bruit et des amplitudes?
Qestion 2 est ce qui fait stand ni, inci, incj, inck
pour? Pourquoi utiliser ni
au lieu de coordonnées x, y? Pourquoi est-ni
avec
incrémentée
ni[0]+=inci;
inci = 1.0 / (Noise3DTexSize / frequency);
Je vois Hugo Elias a créé sa Perlin2D avec coordonnées x, y, et le fait PerlinNoise3D (...).
Merci à l'avance:)
La solution
Je comprends maintenant pourquoi et je vais répondre à ma propre question dans l'espoir que cela aide les autres.
Le bruit de Perlin est en fait une synthèse des bruits de gradient. Dans son processus de production, il faut calculer le produit scalaire d'un vecteur pointant de l'un des coins revêtements de sol du point d'entrée au point d'entrée lui-même avec le vecteur gradient généré au hasard.
Maintenant, si le point d'entrée était un nombre entier, comme les coordonnées xyz d'une texture que vous voulez créer, le produit scalaire retournerait toujours 0, ce qui vous donnerait un bruit plat. Ainsi, au lieu, nous utilisons inci, incj, inck
comme un autre indice. Oui, juste un indice, rien d'autre.
Revenons maintenant à la question 1, il existe deux méthodes pour mettre en œuvre le bruit de Perlin:
1.Calculate les valeurs de bruit séparément et de les stocker dans les fentes RGBA dans la texture
2.Synthesize les bruits avant la main et de les stocker dans une des fentes RGBA dans la texture
noise3(ni)
est la mise en oeuvre effective du procédé 1, tandis que PerlinNoise3D(...)
suggère ce dernier.
A mon avis, la méthode 1 est beaucoup mieux parce que vous avez beaucoup plus de flexibilité sur la façon dont vous utilisez chaque octave dans vos shaders.
Autres conseils
Je pense à la raison d'utiliser noise3(ni)
dans make3DNoiseTexture()
au lieu si PerlinNoise3D(...)
est que lorsque vous utilisez cette texture de bruit dans votre shaders que vous voulez être en mesure de reproduire et modifier la fonctionnalité de PerlinNoise3D(...)
directement dans le shader.
Je pense que la motivation derrière ni, inci, incj, inck
est que l'utilisation de x, y, z du volume directement ne donne pas un bon résultat si en escaladant le bruit avec la fréquence au lieu, il est possible de régler la résolution du bruit indépendamment à partir de la taille du volume.