«Блочный» шум Перлина

Недавно я пытался реализовать генератор шума Perlin в C (на основеКен Перлинс сайтас использованием библиотеки SDL в качестве вывода экрана), но выходные данные показывают, что края между блоками интерполяции не являются непрерывными или гладкими - блоки интерполяции действительно проявляются как блоки.

мы пробовали четыре вида интерполяции, и все "гладкий; плавный" одни выглядят примерно одинаково; только косинус выглядит (очень) немного лучше и прямолинейный выглядит ужасно по сравнению. (ниже косинус и линейный) 

По иронии судьбы, если сделать фрактальную сумму шумов (моя конечная цель этого), линейные сдувает гладкие интерполяции с точки зрения "blockyness» и на самом деле выглядит почти нормально. Я'

Я уверен, что естьчто-то яотсутствует в моем коде или делает это неправильно, но я могукажется, не нашел его.

Любые предположения о том, что (или какие условия) могут быть причиной этих артефактов блока?

Для справки, мой текущий код ниже:

#include
#include
#include

void normalize3(float *vec3){
    float distX=0,distY=0,distZ=0;
    distX=vec3[0];
    distX*=distX;
    distY=vec3[1];
    distY*=distY;
    distZ=vec3[2];
    distZ*=distZ;
    float dist=sqrtf(distX+distY+distZ);
    vec3[0]/=dist;
    vec3[1]/=dist;
    vec3[2]/=dist;
}

float sinterpolate(float scale){
    //return scale*scale*(3.0-2*scale); //Classic 3*t^2-2*t^3

    /*float t=scale*scale;
    float u=t*t;
    return (6.0*u*scale-15.0*u+10.0*t*scale);*/ //Improved 6*t^5-15*t^4+10*t^3

    return (0.5-cosf(scale*M_PI)/2.0); //Straight cosine interpolation
}

float linterpolate(float a,float b,float scale){
    return a+scale*(b-a);
}

float noise3(float *vec3,float *grads,Uint8 *perms){
    vec3[0]=fmodf(vec3[0],256.0);
    vec3[1]=fmodf(vec3[1],256.0);
    vec3[2]=fmodf(vec3[2],256.0);
    Uint8 ivec3[3];

    float relPos[3],temp;
    float cube[2][2][2];
    Uint8 index;

    //One loop for each dimension of noise.
    for(int x=0;x

Ответы на вопрос(2)

Ваш ответ на вопрос