Tôi đã cố gắng tự mình thực hiện tiếng ồn Perlin bằng cách sử dụng lý thuyết (theo flafla2.github.io/2014/08/09/perlinnoise.html). Thật không may, tôi không thể đạt được giao diện của tiếng ồn Perlin "nguyên bản".
Lý do nào khiến đoạn mã dưới đây biểu hiện một phiên bản khối của Perlin Noise?
Tôi nên cải thiện / thay đổi mã gì để nó tạo ra tiếng ồn Perlin mà không có các tạo tác?
Tôi nghi ngờ có thể có vấn đề trong cách tôi nội suy hoặc trong grads
vectơ. Các grads
vector chứa các sản phẩm chấm của (vector ngẫu nhiên cho điểm lưới) và (vector kích thước) - cho tất cả 4 điểm lân cận mạng. (Các vectơ ngẫu nhiên và kích thước được mô tả trong liên kết đầu tiên.)
Hộp cát GLSL: 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 );
}