Bruit Perlin 2D

J'ai pleinement maîtrisé l'art de Bruit de Perlin en 3D, et maintenant je suis en train d'utiliser mon même de la mise en œuvre d'un algorithme 2D.
Le problème semble être dans le choix de mon dégradé les directions. En 3D j'utilise 16 dégradés dans uniformément distribué les directions et cela fonctionne très bien.
En 2D, j'ai pensé utiliser 8 gradients. haut, bas, gauche, droite, et les quatre diagonale les directions.

Voici ce que j'obtiens:

Bruit Perlin 2D

L'aspect général du bruit est toujours correct, mais les bords des carrés n'est pas tout à fait correspondre.
J'ai également essayé d'utiliser d'autres gradients ou moins dégradés, mais obtenir des résultats similaires.
Ici, dans un autre exemple, vous pouvez voir que les bords ne correspondent parfois, et les résultats sont très bien dans ce domaine -

Bruit Perlin 2D

Quand je ne suis pas d'utiliser des dégradés et, au lieu juste d'interpolation entre une valeur sélectionnée aléatoirement à chaque des 4 coins-je obtenir les résultats de la droite, qui est ce qui me fait penser qu'il est le gradient de la partie qui est tout gâcher.

Voici mon code:

//8 different gradient directions
private Point[] grads = new Point[] { 
new Point(0, 1), new Point(1, 1), new Point(1, 0), new Point(1, -1), 
new Point(0, -1), new Point(-1, -1), new Point(-1, 0), new Point(-1, 1),};
//takes the dot product of a gradient and (x, y)
private float dot2D(int i, float x, float y)
{
return
grads[i].X * x + grads[i].Y * y;
}
public float Noise2D(float x, float y)
{
int
ix = (int)(x),
iy = (int)(y);
x  = x - ix;
y  = y - iy;
float
fx  = fade(x),
fy  = fade(y);
ix &= 255;
iy &= 255;
//here is where i get the index to look up in the list of 
//different gradients.
//hashTable is my array of 0-255 in random order
int
g00 = hashTable[ix +     hashTable[iy    ]],
g10 = hashTable[ix + 1 + hashTable[iy    ]],
g01 = hashTable[ix +     hashTable[iy + 1]],
g11 = hashTable[ix + 1 + hashTable[iy + 1]];
//this takes the dot product to find the values to interpolate between
float
n00 = dot2D(g00 & 7, x, y),
n10 = dot2D(g10 & 7, x, y),
n01 = dot2D(g01 & 7, x, y),
n11 = dot2D(g11 & 7, x, y);
//lerp() is just normal linear interpolation
float
y1 = lerp(fx, n00, n10),
y2 = lerp(fx, n01, n11);
return
lerp(fy, y1, y2);
}

source d'informationauteur Frobot