Saya mencoba menerapkan Perlin Noise sendiri menggunakan teori saja (mengikuti flafla2.github.io/2014/08/09/perlinnoise.html). Sayangnya saya tidak dapat mencapai tampilan Perlin Noise "asli".
Apa alasannya kode di bawah ini membuat versi Perlin Noise menjadi kuning?
Apa yang harus saya perbaiki / ubah dalam kode sehingga menjadikan Perlin Noise tanpa artefak?
Saya menduga mungkin ada masalah dalam cara saya interpolasi atau dalam grads
vektor. The grads
vektor berisi produk dot dari (vektor acak untuk titik kisi) dan (vektor ukuran) - untuk semua 4 poin terdekat kisi. (Vektor acak dan ukuran dijelaskan pada tautan pertama.)
GLSL Sandbox: http://glslsandbox.com/e#32663.0
float fade(float t) { return t * t * t * (t * (t * 6. - 15.) + 10.); }
vec2 smooth(vec2 x) { return vec2(fade(x.x), fade(x.y)); }
vec2 hash(vec2 co) {
return fract (vec2(.5654654, -.65465) * dot (vec2(.654, 57.4), co));
}
float perlinNoise(vec2 uv) {
vec2 PT = floor(uv);
vec2 pt = fract(uv);
vec2 mmpt= smooth(pt);
vec4 grads = vec4(
dot(hash(PT + vec2(.0, 1.)), pt-vec2(.0, 1.)), dot(hash(PT + vec2(1., 1.)), pt-vec2(1., 1.)),
dot(hash(PT + vec2(.0, .0)), pt-vec2(.0, .0)), dot(hash(PT + vec2(1., .0)), pt-vec2(1., 0.))
);
return 5.*mix (mix (grads.z, grads.w, mmpt.x), mix (grads.x, grads.y, mmpt.x), mmpt.y);
}
float fbm(vec2 uv) {
float finalNoise = 0.;
finalNoise += .50000*perlinNoise(2.*uv);
finalNoise += .25000*perlinNoise(4.*uv);
finalNoise += .12500*perlinNoise(8.*uv);
finalNoise += .06250*perlinNoise(16.*uv);
finalNoise += .03125*perlinNoise(32.*uv);
return finalNoise;
}
void main() {
vec2 position = gl_FragCoord.xy / resolution.y;
gl_FragColor = vec4( vec3( fbm(3.*position) ), 1.0 );
}