«Блочный» шум Перлина
Недавно я пытался реализовать генератор шума 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