2017-10-07 7 views
1

J'implémente un générateur de planètes sphériques basé sur le bruit 3D Perlin, mais j'obtiens des artefacts de ligne lorsque j'essaie de tirer parti de la dérivée analytique dans les calculs de bruit. Je calculer la dérivée analytique en utilisant l'approche de Milo Yip: 3D Perlin noise analytical derivativeDérivée analytique pour le bruit de perlin 3D produit des artefacts de ligne

Par exemple, lorsque vous essayez d'utiliser le bruit de QI:

float IQturbulence(float3 p, int octaves, float freq, float amp, float gain, float lacunarity) 
{ 
    float sum = 0.5; 
    float3 dsum = float3(0,0,0); 
    for(int i = 0; i < octaves; i++) 
    { 
     float4 n = noiseDeriv((p*freq), (i)/256.0); 
     dsum += n.yzw; 
     sum += amp * n.x/(1 + dot(dsum,dsum)); 
     freq *= lacunarity; 
     amp *= gain; 
    } 
    return sum; 
} 

je reçois ces artefacts de ligne de grille qui ressemblent à ceci:

https://imgur.com/CaNrdZ3

Cependant, ces lignes ne se produisent lorsque je l'effet de levier du produit scalaire (scalaire) du dérivé dans le calcul du bruit,

dire

(1 + dot(deriv,deriv)) 

si cela est utilisé pour moduler l'amplification, la fréquence, etc., il semble toujours produire des artefacts. Lorsque j'utilise la dérivée à la distorsion de domaine, je n'obtiens pas d'artefacts de ligne.

ex.

float4 n = noiseDeriv((p + 0.15 * dsum) * freq, (i)/256.0); 

Est-ce simplement une limitation avec le bruit Perlin classique? Je suis un peu hésitant à changer entièrement les algorithmes de bruit à ce stade de mon projet. :/

  • Note: J'utilise des fonctions quintiques pour calculer le dérivé.
+0

Fait intéressant, le [ce] Page (http://www.decarpentier.nl/scape-procedural-extensions), de Carpentier prend une autre _d dérivé (w * f)/df_ et incorporant que dans son calcul de la dérivée finale (voir sa méthode 'perlinNoiseDeriv'). '// Récupère la dérivée d (w * f)/df' ' float2 dwp = f * f * f * (f * (f * 36 - 75) + 40); // 36f^5 - 75f^4 + 40f^3' Ce n'est pas la dérivée seconde, donc je ne suis pas sûr de ce que cette courbe est pour. Y a-t-il des wizz de maths qui pourraient savoir comment incorporer ceci dans l'équation de Milo Yip?:) de Carpentier est seulement pour 2D. – onehand

Répondre

0

Je ne suis pas sûr si je foiré quelque part ou quoi, mais je suis en mesure d'obtenir les objets enlevés avec succès en remplaçant cette une section pour le dérivé x de la solution de Milo:

float nx = gx000 
    + uP * (dot100 - dot000) 
    + u * (gx100 - gx000) 
    + v * (gx010 - gx000) 
    + w * (gx001 - gx000) 
    + uP * v * (dot110 - dot010 - dot100 + dot000) 
    + u * v * (gx110 - gx010 - gx100 + gx000) 
    + uP * w * (dot101 - dot001 - dot100 + dot000) 
    + u * w * (gx101 - gx001 - gx100 - gx000) 
    + v * w * (gx011 - gx001 - gx010 + gx000) 
    + uP * v * w * (dot111 - dot011 - dot101 + dot001 - dot110 + dot010 + dot100 - dot000) 
    + u * v * w * (gx111 - gx011 - gx101 + gx001 - gx110 + gx010 + gx100 - gx000); 

avec

float a = dot000; 
float b = dot100; 
float c = dot010; 
float d = dot110; 
float e = dot001; 
float f = dot101; 
float g = dot011; 
float h = dot111; 

float nx = uP*(b - a) 
    + uP*v*(a + d - b - c) 
    + uP*w*(a + f - b - e) 
    + uP*v*w*(b + c + e + h - a - d - f - g); 

bruit IQ 3D looks great maintenant! J'ai obtenu la dérivation here.

Je ne devais pas changer ny et nz pour les objets en aller, mais je suis allé de l'avant et ceux mis à jour aussi bien.

float ny = vP*(c - a) 
    + u*vP*(a + d - b - c) 
    + vP*w*(a + g - c - e) 
    + u*vP*w*(b + c + e + h - a - d - f - g); 

float nz = wP*(e - a) 
    + u*wP*(a + f - b - e) 
    + v*wP*(a + g - c - e) 
    + u*v*wP*(b + c + e + h - a - d - f - g);