Bien en fait oui c'est exactement ça que le code au dessus fait, j'implémente la méthode:
Ftileable(x, y) = (
F(x, y) * (w - x) * (h - y) +
F(x - w, y) * (x) * (h - y) +
F(x - w, y - h) * (x) * (y) +
F(x, y - h) * (w - x) * (y)
) / (w * h)
en 3d en rajoutant z, j'utilise deux vec4 (donc 8 valeurs) que je mix tout à la fin pour arriver à ça.
La technique c'est d'associer un entier à chaque "pixel" de noise (je met des guillemets car selon la fréquence du noise désiré la notion de "pixel" peut varier). Cela permet de projeter tout noise sur une fonction 1d déterministe (du pseudo noise). La fonction b implémente cela. Le truc c'est de calculer les indices des 8 pixels autour et d'appeler la fonction de noise 1d (qui fonctionne sur des vec4 dans mon cas.. ça calcule donc 4 valeurs aléatoires à la fois). Et ensuite on fait l'interpolation à la main des 8 pixels environnants. C'est ce qui est fait pour deux vec4 par u.z dans mon code, ensuite je n'ai plus que deux vec2 à interpoler par u.y et finalement deux floats par u.x.
Comme u est calculé de cette manière, vec3 q=floor(p+0.5),u=0.5*sin((p-q)*3.1416)+0.5
(floor(p+0.5) = round(p) si la fonction round est supportée dans ton langage de shading favori)
Cela fait un noise de classe infinie puisque le sinus est dérivable à l'infini (d'autres utilisent la fonction smoothstep ou un polynôme de degré 5). C'est aussi possible de stocker toutes les valeurs de noise dans une texture et d'utiliser le filtrage linéaire ou de rectifier en faisant des lookups de tous les texels à la main avec le filtrage qui te convient.
EDIT: je raconte des aneries encore, ce qui fait tiler le noise c'est ça:
vec3 qv=mod(q,t)*v,rv=mod(q+1,t)*v;
t étant la "taille" en pixels sur laquelle le noise devrait tiler. q est la coordonnée en 3d du "pixel", et ensuite les différentes composantes xyz de q sont combinées dans la ligne qui est super longue et illisible pour former le cube.